使用kubeadm安装kubernetes 1.15
1、主机准备篇
使用vmware Workstation 10创建一台虚拟机,配置为2C/2G/50G,操作系统为CentOS Linux release 7.6.1810 (Core)。
IP地址为:192.168.198.136(DHCP自动分配的)
以root身份登录该主机,开始相关操作。
禁用SELinux
# setenforce 0
# vim /etc/selinux/config
SELINUX=enforcing改为SELINUX=disabled
禁用防火墙
# systemctl disable firewalld
# systemctl stop firewalld
在yum仓库中添加kubernetes
# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
安装docker、kubelet、kubeadm、kubectl、kubernetes-cni
# yum install docker kubelet kubeadm kubectl kubernetes-cni -y
# systemctl enable docker && systemctl start docker
# systemctl enable kubelet && systemctl start kubelet
# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
# sysctl -p /etc/sysctl.d/k8s.conf
禁用交换分区
# swapoff -a
# sed -i '/ swap / s/^/#/' /etc/fstab
刚才的主机就作为kubernetes集群的主节点,现在克隆它,制造2台工作节点。
克隆完毕后,现在咱们的主机有3台:
192.168.198.136 2C/2G/50G 主节点
设置主机名:hostnamectl --static set-hostname master.k8s
192.168.198.131 2C/2G/50G 工作节点
设置主机名:hostnamectl --static set-hostname node1.k8s
192.168.198.132 2C/2G/50G 工作节点
设置主机名:hostnamectl --static set-hostname node2.k8s
为三台主机配置名称解析
# vim /etc/hosts
192.168.198.136 master.k8s
192.168.198.131 node1.k8s
192.168.198.133 node2.k8s
三台主机都得填写。
2、主节点初始化篇
由于初始化的过程中,要去k8s.gcr.io网站下载相关的镜像,而我们国内无法访问外网,所以只能另想其他办法。
找出需要下载的镜像列表
在主节点执行以下命令:
# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.15.0
k8s.gcr.io/kube-controller-manager:v1.15.0
k8s.gcr.io/kube-scheduler:v1.15.0
k8s.gcr.io/kube-proxy:v1.15.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1
这是我的结果,你在实验时,每个镜像的版本可能不一定是这样,但不影响你的实验。
下载每个镜像
既然国外无法下载,那就从国内下载。因为阿里云做了镜像,所以我们直接从阿里云下载。
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.15.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.15.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.15.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.15.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.3.10
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.3.1
修改镜像的标签
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.15.0 k8s.gcr.io/kube-apiserver:v1.15.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.15.0 k8s.gcr.io/kube-controller-manager:v1.15.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.15.0 k8s.gcr.io/kube-scheduler:v1.15.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.15.0 k8s.gcr.io/kube-proxy:v1.15.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
开始初始化
# kubeadm init --pod-network-cidr=10.244.0.0/16
初始化完成后,最后会出现一行添加工作节点的命令:
kubeadm join 192.168.198.136:6443 --token 5r4ez7.srmu7uaxghoiprpr \
--discovery-token-ca-cert-hash sha256:0f31247ea401aa84d1abda61b45a46d53777f1743391d31c2152b95b34e29a43
在主节点上运行kubectl
要想运行kubectl,需要设置环境变量:
# export KUBECONFIG=/etc/kubernetes/admin.conf
# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
# kubectl get po -n kube-system
此时可以看到coredns这个pod还未运行,因为没有安装网络插件。
# kubectl get nodes
此时可以看到主节点的状态是NotReady,因为没有安装网络插件。
在将工作节点加入集群前,有一点需要提前做好准备,那就是:在工作节点上运行pod时,必须要有pause镜像的支持,否则任何pod都无法运行。
目前已知在工作节点上要运行的pod有:
kube-proxy
kube-flannel
pause
由于kube-flannel刚好可以在国内下载,所以我们要处理的有kube-proxy和pause。
处理方法同前面的步骤,直接从阿里云下载,然后打标签即可。
注意在2个工作节点都要如此操作。具体步骤不写出来,同上。
处理完之后,就可以开始下面的步骤了。
(我在这个地方栽了半天)
将另外2台工作节点加入到集群中
在node1.k8s上执行:
# kubeadm join 192.168.198.136:6443 \
--token 5r4ez7.srmu7uaxghoiprpr \
--discovery-token-ca-cert-hash \
sha256:0f31247ea401aa84d1abda61b45a46d53777f1743391d31c2152b95b34e29a43
在node2.k8s上执行:
# kubeadm join 192.168.198.136:6443 \
--token 5r4ez7.srmu7uaxghoiprpr \
--discovery-token-ca-cert-hash \
sha256:0f31247ea401aa84d1abda61b45a46d53777f1743391d31c2152b95b34e29a43
然后到主节点上查看节点是否进入集群:
# kubectl get nodes
此时发现2台工作节点已经进入集群,只是状态为NotReady。
查看节点NotReady的原因
# kubectl describe node node1.k8s
得知是CNI网络插件的原因。
安装网络插件,我们选择flannel:
# wget \
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# kubectl apply -f kube-flannel.yml
稍等片刻,在主节点上再次查看各节点的状态,以及各pods的状态:
# kubectl get nodes
# kubectl get pods -n kube-system
到这里,我们使用kubeadm创建了一个kubernetes集群。该集群拥有3个节点,1个主节点,2个工作节点。
中间遇到的坎有:
1、因kube-proxy镜像无法从国内下载,导致2个工作节点上无法运行kube-proxy的pod,使得整体的集群无法成功。
2、同理,pause镜像也是同样的问题。
3、在1.15版本中,好像只能使用flannel网络插件。因为我在使用另一个插件weave-net时,总是报错:
open /run/flannel/subnet.env: no such file or directory,说明在新版的kubernetes中,只能使用flannel。