环境准备
部署环境规划如下
节点 | IP | 备注 |
---|---|---|
k8s-master | 10.0.0.251 | master节点 |
k8s-node1 | 10.0.0.252 | node节点1 |
k8s-node2 | 10.0.0.253 | node节点2 |
部署前准备
1.设置各个节点主机名称和配置域名解析
注意:各个节点的主机名要不一样,主机名重复会造成各个节点工作不正常
设置主机名
[root@k8s-master ~]# hostnamectl set-hostname k8s-master
[root@k8s-node1 ~]# hostnamectl set-hostname k8s-node1
[root@k8s-node2 ~]# hostnamectl set-hostname k8s-node2
配置域名解析
[root@k8s-master ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
10.0.0.251 k8s-master
10.0.0.252 k8s-node1
10.0.0.253 k8s-node2[root@k8s-node1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
10.0.0.251 k8s-master
10.0.0.252 k8s-node1
10.0.0.253 k8s-node2[root@k8s-node2 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
10.0.0.251 k8s-master
10.0.0.252 k8s-node1
10.0.0.253 k8s-node2
2.所有节点关闭防火墙
[root@k8s-master ~]# systemctl stop firewalld && systemctl disable firewalld
[root@k8s-node1 ~]# systemctl stop firewalld && systemctl disable firewalld
[root@k8s-node2 ~]# systemctl stop firewalld && systemctl disable firewalld
3.所有节点关闭selinux
[root@k8s-master ~]# vi /etc/selinux/config
SELINUX=disabled
[root@k8s-node1 ~]# vi /etc/selinux/config
SELINUX=disabled
[root@k8s-node2 ~]# vi /etc/selinux/config
SELINUX=disabled
4.所有节点关闭交换分区
[root@k8s-master ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab
[root@k8s-nodes1 ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab
[root@k8s-node2 ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab
5.所有节点配置IP转发相关配置
[root@k8s-master ~]# echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
[root@k8s-master ~]# echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
[root@k8s-node1 ~]# echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
[root@k8s-node1 ~]# echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
[root@k8s-node2 ~]# echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
[root@k8s-node2 ~]# echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
6.关闭交换分区和设置selinux需要重启机器才能生效,重启机器
[root@k8s-master ~]# reboot
[root@k8s-node1 ~]# reboot
[root@k8s-node2 ~]# reboot
初始化集群
1.配置docker和k8s的yum源
docker的yum源采用直接下载
[root@k8s-master ~]# [root@k8s-master yum.repos.d]# cd /etc/yum.repos.d && wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@k8s-node1 ~]# [root@k8s-master yum.repos.d]# cd /etc/yum.repos.d && wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@k8s-node2 ~]# [root@k8s-master yum.repos.d]# cd /etc/yum.repos.d && wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
k8s的yum源
[root@k8s-master ~]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
enabled=1
[root@k8s-node1 ~]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
enabled=1
[root@k8s-node2 ~]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
enabled=1
2.安装docker
注意:k8s不同版本对docker有要求,k8s与docker的版本匹配情况需要查看官网说明。这里的k8s v1.12.2采用的是docker-ce -18.06版本,如果选择的docker版本与k8s不匹配,安装过程会报错docker不支持。
[root@k8s-master ~]# yum install docker-ce-18.06.0.ce-3.el7 -y
[root@k8s-node1 ~]# yum install docker-ce-18.06.0.ce-3.el7 -y
[root@k8s-node2 ~]# yum install docker-ce-18.06.0.ce-3.el7 -y
3.安装kubeadm kubelet kubectl
注意:不要使用命令
yum install -y kubeadm-1.12.2 kubelet-1.12.2 kubectl-1.12.2 --disableexcludes=kubernetes 安装
kubeadm软件包会依赖与kubelet,kubectl。在安装kubeadm过程中会自动安装其默认依赖的1.14的kubelet和kubectl,安装kubeadm执行后,机器上就已经含有1.14版本的kubelet,后面的kubelet-1.12.2不会再安装,导致执行后面执行init命令错误,分开安装,并且kubelet和kubectl在前面,kubeadm在最后。
[root@k8s-master ~]# yum install -y kubelet-1.12.2 --disableexcludes=kubernetes
[root@k8s-master ~]# yum install -y kubectl-1.12.2 --disableexcludes=kubernetes
[root@k8s-master ~]# yum install -y kubeadm-1.12.2 --disableexcludes=kubernetes
[root@k8s-node1 ~]# yum install -y kubelet-1.12.2 --disableexcludes=kubernetes
[root@k8s-node1 ~]# yum install -y kubectl-1.12.2 --disableexcludes=kubernetes
[root@k8s-node1 ~]# yum install -y kubeadm-1.12.2 --disableexcludes=kubernetes
[root@k8s-node2 ~]# yum install -y kubelet-1.12.2 --disableexcludes=kubernetes
[root@k8s-node2 ~]# yum install -y kubectl-1.12.2 --disableexcludes=kubernetes
[root@k8s-node2 ~]# yum install -y kubeadm-1.12.2 --disableexcludes=kubernetes
4.所有节点启动docker,同时设置kubelet开机自启动否则,否则后面预检查提示错误。
[root@k8s-master ~]# systemctl enable docker && systemctl start docker
[root@k8s-master ~]# systemctl enable kubelet
[root@k8s-node1~]# systemctl enable docker && systemctl start docker
[root@k8s-node1 ~]# systemctl enable kubelet
[root@k8s-node2 ~]# systemctl enable docker && systemctl start docker
[root@k8s-node2 ~]# systemctl enable kubelet
5.所有节点导入k8s安装依赖的镜像包。
链接:https://pan.baidu.com/s/1tXJYL7-KdPJRRlPBg83OyQ
提取码:bxwn
[root@k8s-master ~]# docker load -i k8s.gcr.io.basic.tar.gz
[root@k8s-node1 ~]# docker load -i k8s.gcr.io.basic.tar.gz
[root@k8s-node2 ~]# docker load -i k8s.gcr.io.basic.tar.gz
6.初始化master节点,这一步很关键,也会输出很多的信息。
[root@k8s-master ~]# kubeadm init --kubernetes-version=v1.12.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
注意:执行这条命令后,查看/var/log/messages日志可能提示cni config uninitialized错误。
可以采用如下方式解决:
编辑文件/var/lib/kubelet/kubeadm-flags.env,去掉network-plugin=cni 就可以了。然后重启kubelet服务
[root@k8s-master ~]# vi /var/lib/kubelet/kubeadm-flags.env
[root@k8s-master ~]# KUBELET_KUBEADM_ARGS=--cgroup-driver=systemd --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d
[root@k8s-master ~]# systemctl restart kubelet
另外执行这条命令以后,控制台会输出一条node加入节点所需要执行的命令
kubeadm join 10.0.0.251:6443 --token c5vrrw.w6omvs8c8gkslmbr --discovery-token-ca-cert-hash sha256:3917060e94d8f7d9ac0dfe0c7adfcd59fd9d08e773644471e976e256eaec6cb1
还会输出后面配置配置kubectl权限的命令语句。
这个时候coredns还处于peddding状态,因为coredns需要部署到node节点上,加入node节后,coredns才会变为running状态
7.master节点配置kubectl权限,使master节点可以执行kubectl命令。
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
8.部署flannel网络插件
[root@k8s-master ~]# wget https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml
添加node节点
1.执行master节点上init后控制台输出的kubeadm join命令,将node节点添加到集群中。
[root@k8s-node1 ~]# kubeadm join 10.0.0.251:6443 --token c5vrrw.w6omvs8c8gkslmbr --discovery-token-ca-cert-hash sha256:3917060e94d8f7d9ac0dfe0c7adfcd59fd9d08e773644471e976e256eaec6cb1
[root@k8s-node2 ~]# kubeadm join 10.0.0.251:6443 --token c5vrrw.w6omvs8c8gkslmbr --discovery-token-ca-cert-hash sha256:3917060e94d8f7d9ac0dfe0c7adfcd59fd9d08e773644471e976e256eaec6cb1
执行命令后,两个节点的状态也是notready状态,查看系统日志同样会提示cni config uninitialized错误,采取和master节点一样的处理方式,修改配置文件,然后重启kubelet服务
[root@k8s-node1 ~]# vi /var/lib/kubelet/kubeadm-flags.env
[root@k8s-node1 ~]# KUBELET_KUBEADM_ARGS=--cgroup-driver=systemd --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d
[root@k8s-node1 ~]# systemctl restart kubelet
[root@k8s-node2 ~]# vi /var/lib/kubelet/kubeadm-flags.env
[root@k8s-node2 ~]# KUBELET_KUBEADM_ARGS=--cgroup-driver=systemd --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d
[root@k8s-node2 ~]# systemctl restart kubelet
验证
1.检查各个节点的状态是否正常
[root@k8s-node1 ~]# kubectl get node
2.检查系统pod是否正常
[root@k8s-master ~]# kubectl get po --all-namespaces -o wide
遗留问题
1.如果执行初始化master节点以后,不部署flannel网络插件而是直接加入node节点,加入node节点以后,再部署flannel网络插件,这个时候发布的Pod正常不?
测试的结果为不正常,先添加node节点,再部署flannel网络插件,然后发布pod,发现pod的IP地址并不在初始化集群定义的IP网段内,IP无法ping通。部署flannel网络插件的动作应该放在初始化集群后,添加node节点之前执行。