使用kubeadm安装指定版本的kubernetes(安装1.14.0,最新版本为1.14.1),本教程使用root
用户安装
一、前置条件(所有节点)
二、配置(所有节点)
2.1 yum源
在/etc/repos.d/
目录下创建文件kubernetes.repo
,内容如下
Copy [kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
2.2 加载br_netfilter模块
执行以下命令查看br_netfilter
模块是否已加载
Copy $ lsmod | grep br_netfilter
如果没有,则手动加载
Copy $ modprobe br_netfilter
备注:实践中发现,即使手动加载该模块后lsmod | grep br_netfilter
的输出还是为空,没关系,直接忽略
2.3 关闭selinux
Copy $ setenforce 0
$ sed -i 's#SELINUX=enforcing#SELINUX=permissive#g' /etc/selinux/config
2.4 关闭firewalld
Copy $ systemctl stop firewalld && systemctl disable firewalld
2.5 iptables
创建文件/etc/sysctl.d/k8s.conf
,内容如下
Copy net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
然后执行命令使其生效
三、安装kubelet、kubectl、kubeadm(所有节点)
查看kubernetes的版本信息,可以看到当前最新版本为v1.14.1
Copy $ yum list kubelet --showduplicates | sort -r
...
kubelet.x86_64 1.14.1-0 kubernetes
kubelet.x86_64 1.14.0-0 kubernetes
...
这里我们安装1.14.0
,执行以下命令安装kubelet、kubectl、kubeadm
Copy $ yum -y install kubelet-1.14.0 kubectl-1.14.0 kubeadm-1.14.0
然后启动kubelet
Copy $ systemctl daemon-reload
$ systemctl enable kubelet
$ systemctl restart kubelet
注意:此时如果用命令systemctl status kubelet
查看kubelet的状态,并不是active
,没有关系
四、安装Master(master节点)
4.1 初始化master
首先执行以下命令下载所需镜像,如果成功的话会有如下输出,下载了如下的七个镜像:
Copy $ kubeadm config images pull --kubernetes-version=1.14.0
[config/images] Pulled k8s.gcr.io/kube-apiserver:v1.14.0
[config/images] Pulled k8s.gcr.io/kube-controller-manager:v1.14.0
[config/images] Pulled k8s.gcr.io/kube-scheduler:v1.14.0
[config/images] Pulled k8s.gcr.io/kube-proxy:v1.14.0
[config/images] Pulled k8s.gcr.io/pause:3.1
[config/images] Pulled k8s.gcr.io/etcd:3.3.10
[config/images] Pulled k8s.gcr.io/coredns:1.3.1
然后执行以下命令初始化master,该命令会有很多输出,安装失败的话可以从输出中找到错误信息。如果安装成功,则会在最后打印出类似如下的信息:
Copy $ kubeadm init --pod-network-cidr=172.26.0.0/16 --kubernetes-version=1.14.0
...
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.1.101:6443 --token 5pjzvm.7wc1p9at38nsqsd5 \
--discovery-token-ca-cert-hash sha256:eb0dbfb61972b8f8a3b80a3392fae30cd2024148f87aa71ff03ac94443edacf
4.2 使用kubectl
如果非root用户想使用kubectl工具,执行以下命令
Copy $ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
如果是root用户想使用kubectl工具,执行以下命令(本教程使用root用户)
Copy export KUBECONFIG=/etc/kubernetes/admin.conf
4.3 安装网络插件
这里我们使用网络插件calico,执行以下命令安装
Copy $ kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
$ kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml
如果提示说文件下载不下来,你可以手动把rbac-kdd.yaml
与calico.yaml
这两个文件先下载下来,然后再执行命令
Copy $ kubectl apply -f rbac-kdd.yaml
$ kubectl apply -f calico.yaml
4.4 验证master节点
在master上执行以下命令,查看master节点的状态,应当为Ready
Copy $ kubectl get node
NAME STATUS ROLES AGE VERSION
peng01 Ready master 4m v1.14.0
五、安装Node(node节点)
在master上执行以下命令,获取bootstrap token
,输出如下:
Copy $ kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
5pjzvm.7wc1p9at38nsqsd5 23h 2019-04-02T21:28:07-04:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
bootstrap token
的过期时间一般为24小时,如果没有可用的token,则执行以下的命令创建一个
Copy $ kubeadm token create
在master上执行以下命令获取--discovery-token-ca-cert-hash
,输出如下
Copy $ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
eb0dbfb61972b8f8a3b80a3392fae30cd2024148f87aa71ff03ac94443edacf
然后,在node节点上执行以下命令,将节点加入到集群中(注意:在执行此命令前,也需要先在node节点上安装好docker、kubelet、kubeadm)
Copy $ kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>
最后,我们验证一下node节点是否成功加入到集群:在master上执行以下命令,应当看到node为Ready
状态
Copy $ kubectl get node
NAME STATUS ROLES AGE VERSION
peng01 Ready master 10m v1.14.0
peng02 Ready <none> 6m v1.14.0
六、去掉Master的污点
默认情况下,master节点上有一个污点,如下:
Copy spec:
podCIDR: 172.26.0.0/24
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
我们需要去掉这个污点,使用Pod能正常调度到master节点上。执行以下命令:
Copy $ kubectl patch node peng01 -p '{"spec":{"taints":[]}}'
FAQ
Q: 节点长时间为NotReady
状态?
A:执行命令kubectl get pod -o wide -n kube-system | grep calico-node
查看节点上的calico-node
是否为Running
状态,如果一直是ContainerCreating
状态,有可能是calico的镜像一直下载不下来。在节点上执行命令检查calico的镜像是否成功下载下来:
Copy $ docker images | grep calico
calico/node v3.3.6 ce902e610f51 5 days ago 75.3MB
calico/cni v3.3.6 b8eeeae14aa4 5 days ago 75.4MB