使用kubeadm安装k8s

在安装前,最好事先准备好一个干净的环境,不然会浪费更多的时间,尤其是之前折腾过docker的一些环境。我因为之前安装过一个低版本的docker-ce,之后用yum进行升级之后,再去安装kubeadm,kubectl出现各种问题,最后放弃解决了。

搭建环境

  1. CentOS 7.6
  2. Docker 18.06.1-ce
  3. Kubernetes v1.13.1
  4. virtualBox 5.0.38

机器

  1. master:hostname:master.localdomain ip: 10.17.3.110

前期准备

  1. 设置双核
    注:k8s要求

关闭虚拟机之后,设置->系统->处理器->设置为2

  1. 关闭防火墙
    关闭防火墙
1
2
systemctl stop firewalld
systemctl disable firewalld

禁用SELINUX

1
2
setenforce 0
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
  1. 关闭swap分区
    注:k8s要求

临时生效

1
swapoff -a

永久生效

在文件/etc/fstab中,删除”swap”这一行

1
/dev/mapper/cl-swap swap swap defaults 0 0

  1. 修改hostname
    注: kubernetes 是根据 hostname 来标示各节点的
1
2
3
echo "master.localdomain" > /etc/hostname
echo "10.17.3.110 master.localdomain" >> /etc/hosts
sysctl kernel.hostname=master.localdomain

安装docker

  1. 添加docker镜像
1
2
3
4
5
6
7
8
cat <<EOF > /etc/yum.repos.d/docker.repo
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
  1. 安装依赖,添加镜像
1
2
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  1. 查看最新的docker版本
1
2
yum makecache fast
yum list docker-ce.x86_64 --showduplicates |sort -r
  1. 安装18.06.1
    注:Kubernetes 1.12已经针对Docker的1.11.1, 1.12.1, 1.13.1, 17.03, 17.06, 17.09, 18.06等版本做了验证,需要注意Kubernetes 1.12最低支持的Docker版本是1.11.1
1
2
yum install -y --setopt=obsoletes=0 \
docker-ce-18.06.1.ce-3.el7

启动docker

1
2
systemctl start docker
systemctl enable docker

验证

1
docker -v

确认一下iptables filter表中FOWARD链的默认策略(pllicy)为ACCEPT
注:Docker从1.13版本开始调整了默认的防火墙规则,禁用了iptables filter表中FOWARD链,这样会引起Kubernetes集群中跨Node的Pod无法通信

1
iptables -nvL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Chain INPUT (policy ACCEPT 103 packets, 13250 bytes)
pkts bytes target prot opt in out source destination
22366 18M KUBE-EXTERNAL-SERVICES all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate NEW /* kubernetes externally-visible service portals */
817K 176M KUBE-FIREWALL all -- * * 0.0.0.0/0 0.0.0.0/0
# 在这里,注意看
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 KUBE-FORWARD all -- * * 0.0.0.0/0 0.0.0.0/0 /* kubernetes forwarding rules */
0 0 DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 DOCKER-ISOLATION-STAGE-1 all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 128 packets, 19058 bytes)
pkts bytes target prot opt in out source destination
14698 884K KUBE-SERVICES all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate NEW /* kubernetes service portals */
809K 159M KUBE-FIREWALL all -- * * 0.0.0.0/0 0.0.0.0/0

安装kubelet,kubeadm,kubectl

  1. 添加国内kubelet镜像
1
2
3
4
5
6
7
8
9
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
  1. 修改网络开启桥接网络支持,只针对(RHEL/CentOS 7)系统
    注:配置转发相关参数,否则可能会出错
1
2
3
4
5
6
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness=0
EOF

执行命令使其生效

1
2
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
  1. 安装
1
yum install -y kubelet kubeadm kubectl ipvsadm

3.1 安装k8s-1.11.3的版本

1
2
3
mkdir k8s-1.11.3 && cd k8s-1.11.3
yumdownloader kubectl-1.11.3 kubelet-1.11.3 kubeadm-1.11.3 cri-tools-1.12.0 kubernetes-cni-0.6.0 socat-1.7.3.2
yum install ./*.rpm -y

  1. 配置kubelet和docker的cgroups一致
1
2
3
4
5
DOCKER_CGROUPS=$(docker info | grep 'Cgroup' | cut -d' ' -f3)
echo $DOCKER_CGROUPS
cat >/etc/sysconfig/kubelet<<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=$DOCKER_CGROUPS --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1"
EOF
  1. 启动
    注:这个时候查看版本或者kubectl都会报错”The connection to the server localhost:8080 was refused
    “,不要担心,接着走后面的流程
1
2
systemctl daemon-reload
systemctl enable kubelet && systemctl restart kubelet

启动master

  1. kubeadm初始化
    注:见到这个文字就表示成功了”Your Kubernetes master has initialized successfully!”
    如果失败了,执行kubeadm reset删除之前的一些文件,再进行kubeadm init

因为我们选择flannel作为Pod网络插件,所以上面的命令指定–pod-network-cidr=10.244.0.0/16

1
kubeadm init --kubernetes-version=v1.13.1 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=10.17.3.110
  1. 按照successfully提示执行后续命令
1
2
3
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
  1. 验证
1
2
kubectl version
kubectl get nodes

添加flannel网络

  1. 下载yml文件

    1
    wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  2. 添加iface启动参数
    注:有多个网卡的话,需要在kube-flannel.yml中使用–iface参数指定集群主机内网网卡的名称,否则可能会出现dns无法解析。比如我是用的virtualBox,存在多个网卡,使用的是enp0s3网卡,所以修改如下(因为yaml文件创建5个针对不同平台的DaemonSet,所以最好是都改了)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    containers:
    - name: kube-flannel
    image: quay.io/coreos/flannel:v0.10.0-amd64
    command:
    - /opt/bin/flanneld
    args:
    - --ip-masq
    - --kube-subnet-mgr
    - --iface=enp0s3
  3. 安装

    1
    kubectl apply -f kube-flannel.yml

添加node节点

  1. 添加节点
    1
    kubeadm join 10.17.3.110:6443 --token vh535w.c4abw601jzuxt7su --discovery-token-ca-cert-hash sha256:25bf91dd3e69f0bfe1f5600f0ac56633ed5c58ca89d906b6cad611eb01e04356

测试网络

  1. 创建测试development

    1
    kubectl run curl --image=radial/busyboxplus:curl -it
  2. 在容器中执行

    1
    nslookup kubernetes.default

输出结果如下:

1
2
3
4
5
6
7
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes.default
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
kubectl delete deployment curl
  1. 删除
    1
    kubectl delete deployment curl

验证集群

  1. 查看集群状态
    1
    kubectl get cs

输出结果如下

1
2
3
4
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health": "true"}

  1. 查看node状态
    注:刚执行完添加节点命令后,可以稍等下再去查看
    1
    kubectl get nodes

输出结果如下:

1
2
3
NAME STATUS ROLES AGE VERSION
kubeadm-node1 Ready <none> 8m36s v1.13.1
master.localdomain Ready master 15m v1.13.1

  1. 查看pod状态
    1
    kubectl -n kube-system get pod --all-namespaces

输出结果如下:

1
2
3
4
5
6
7
8
9
10
11
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-86c58d9df4-tjcdl 1/1 Running 0 12m
kube-system coredns-86c58d9df4-vzf95 1/1 Running 0 12m
kube-system etcd-master.localdomain 1/1 Running 0 12m
kube-system kube-apiserver-master.localdomain 1/1 Running 0 12m
kube-system kube-controller-manager-master.localdomain 1/1 Running 0 12m
kube-system kube-flannel-ds-amd64-6zvwg 1/1 Running 5 6m2s
kube-system kube-flannel-ds-amd64-q62rd 1/1 Running 0 9m47s
kube-system kube-proxy-8dlpf 1/1 Running 0 12m
kube-system kube-proxy-xcwhj 1/1 Running 0 6m2s
kube-system kube-scheduler-master.localdomain 1/1 Running 0 12m

其他注意项

  1. 初始化master节点(kubeadm init)失败后,使用”kubeadm reset”回到初始化之前的状态,再次进行初始化

  2. master初始化成功后,没有记录node加入集群的命令(kubectl join)
    简单方法

    1
    kubeadm token create --print-join-command

第二种方法

1
2
token=$(kubeadm token generate)
kubeadm token create $token --print-join-command --ttl=0

token 是使用指令 kubeadm token generate 生成的,执行过程如有异常,用命令kubeadm reset 初始化后重试,生成的 token 有效时间为 24 小时,超过 24 小时后需要重新使用命令 kubeadm token create 创建新的 token。
discovery-token-ca-cert-hash 的值可以使用命令查看,命令:openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed ‘s/^.* //‘

  1. 查看kube-system日志
1
kubectl -n kube-system logs kube-controller-manager-master.localdomain
  1. 重新部署node

在集群中删除node信息(在master执行)

1
2
kubectl drain <node_name> --delete-local-data --force --ignore-daemonsets
kubectl delete node <node_name>

node删除flannel网段

1
2
3
4
5
6
kubeadm reset
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/

  1. 节点状态不正确
    查看日志
1
journalctl -u kubelet

查看kubelet状态

1
systemctl status kubelet

  1. 其他节点管理集群
    1
    2
    scp root@<master_ip>:/etc/kubernetes/admin.conf .
    kubectl --kubeconfig ./admin.conf get nodes

注意:
当使用systemctl start kubelet失败的时候,可以使用”systemctl status kubelet -l”,”journalctl -xeu kubelet
“查看详细信息

  1. 如果网络发生了变更
    先回滚,再初始化,按照上述流程走
    kubeadm reset
    kubeadm init
    #记得修改/etc/hosts
    #记得修改hostname(/etc/hostname和/etc/sysconfig/network)
    

    参考链接

    亮亮的k8s搭建
    kubeadm-install-k8s
    centos7使用kubeadm安装kubernetes 1.11版本多主高可用
    使用kubeadm安装Kubernetes 1.12
    国内使用 kubeadm 在 Centos 7 搭建 Kubernetes 集群
坚持原创技术分享,您的支持将鼓励我继续创作!