kubernetes安装指南

Overview

本文介绍如何使用kubeadm安装一个简单的包含三个节点的集群。


测试环境

三台VM,分别为test-vm, test-vm-1, test-vm-2,系统是ubuntu 19.04

下载

kubernetes的安装包,官方文档用apt get的方式,由于国内被墙了没法get到,可以直接从github上下载release包。把kubeadm,kubelet, kubectl装好就够了。docker当然也要装好。
具体的安装步骤暂时略过。

配置kubelet

三台节点可以手动配置一下kubelet服务,配置方法都是一样的:

 1# cat > /lib/systemd/system/kubelet.service  << EOF
 2[Unit]
 3Description=kubelet: The Kubernetes Node Agent
 4Documentation=http://kubernetes.io/docs/
 5
 6[Service]
 7ExecStart=/usr/bin/kubelet
 8Restart=always
 9StartLimitInterval=0
10RestartSec=10
11
12[Install]
13WantedBy=multi-user.target
14EOF

上面就是简单的调用了下kubelet命令,实际上还有很多参数,这个不着急。因为我们是用kubeadm配置的,所以实际上生效的是kubeadm为kubelet设置的参数,kubelet的启动将依赖kubeadm设置的bootstrap配置:

 1# mkdir -p /etc/systemd/system/kubelet.service.d/
 2# cat > /etc/systemd/system/kubelet.service.d/10-kubeadm.conf << EOF
 3[Service]
 4Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
 5Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
 6# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
 7EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
 8# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably,
 9# the user should use the .NodeRegistration.KubeletExtraArgs object in the configuration files instead.
10# KUBELET_EXTRA_ARGS should be sourced from this file.
11EnvironmentFile=-/etc/default/kubelet
12ExecStart=
13ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
14EOF

设置开机启动

1# systemctl daemon-reload
2# systemctl enable kubelet
3# systemctl start kubelet
4# swapoff -a    //K8s要求关闭swap

docker我这里默认都配置好了,就不详细讲解了。

拉起master节点

这里我们用test-vm作为master节点。

主要参考这个: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

这里我先想好要用什么网络方案,自己尝试了下calico,总感觉有点问题。保守点先选择Flannel好了。
引用一段:

For flannel to work correctly, you must pass --pod-network-cidr=10.244.0.0/16 to kubeadm init.

master节点拉起K8s control plane:

1# kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository=docker.io/mirrorgooglecontainers --kubernetes-version=1.13.4 --ignore-preflight-errors=SystemVerification

镜像仓库选用了docker.io/mirrorgooglecontainers 是因为默认是从k8s.io这个镜像仓库拉K8s控制组件的,这个在CN是被和谐的;K8s版本这里我永乐1.13.4,init过程把SystemVerification禁用了,是因为我的内核版本太高了(5.0.0-16),检查报错。

运行中你可能会发现报错docker.io/mirrorgooglecontainers/coredns 镜像拉取不下来,那是因为我把所有仓库都默认换到coredns里,mirrorgooglecontainer里面并不包含coredns。手动拉取一个coredns镜像并且tag为docker.io/mirrorgooglecontainers/coredns 就可以了(tag省略了)。

现在开始烧香拜佛,不顺利的话会看到报错or看不到报错,慢慢debug吧;一切顺利的话可以看到成功消息:

 1Your Kubernetes master has initialized successfully!
 2
 3To start using your cluster, you need to run the following as a regular user:
 4
 5  mkdir -p $HOME/.kube
 6  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 7  sudo chown $(id -u):$(id -g) $HOME/.kube/config
 8
 9You should now deploy a pod network to the cluster.
10Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
11  https://kubernetes.io/docs/concepts/cluster-administration/addons/
12
13You can now join any number of machines by running the following on each node
14as root:
15
16  kubeadm join 192.168.122.2:6443 --token 8e8iei.lh8gumyd8ap7kgtz --discovery-token-ca-cert-hash sha256:84f7d6aeec39dc6efe60db6c82f8d97dc220c96e6455a1710c17daa060ef9300

自己按照上面信息指引把$HOME/.kube/config搞好,就可以用普通用户操作k8s集群了。下面的kubeadm留好,后面要在worker上用。

查看下状态:

 1# kubectl get node
 2NAME      STATUS     ROLES    AGE    VERSION
 3test-vm   NotReady   master   5m4s   v1.13.4
 4
 5# kubectl get componentstatus
 6NAME                 STATUS    MESSAGE              ERROR
 7controller-manager   Healthy   ok                   
 8scheduler            Healthy   ok                   
 9etcd-0               Healthy   {"health": "true"}  
10
11# kubectl -n kube-system get pod
12NAME                              READY   STATUS    RESTARTS   AGE
13coredns-9f7ddc475-8jl54           0/1     Pending   0          6m3s
14coredns-9f7ddc475-g79j2           0/1     Pending   0          6m3s
15etcd-test-vm                      1/1     Running   0          5m10s
16kube-apiserver-test-vm            1/1     Running   0          5m28s
17kube-controller-manager-test-vm   1/1     Running   0          5m7s
18kube-proxy-vqqf4                  1/1     Running   0          6m3s
19kube-scheduler-test-vm            1/1     Running   0          5m12s

可以看到K8s的控制面正常,但是coredns pending了,这个是因为网络还没配置。
先别动worker节点,我们先把网络配好。

上面我们说用Flannel:

1# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/62e44c867a2846fefb68bd5f178daf4da3095ccb/Documentation/kube-flannel.yml

如果kubectl -n kube-system get pod 显示coredns变成running了,那就说明一切顺利,都成功了。

不过我就遇到了一个小问题,coredns一直不变成running,利用命令kubectl -n kube-system describe pod coredns-9f7ddc475-8jl54查看错误发现,/opt/cni/bin/bridge找不到导致无法teardown pod,我找到了个bridge的cni插件放过去就解决了。

增加worker

在worker节点test-vm-1,test-vm-2上执行同样步骤:

1# kubeadm join 192.168.122.2:6443 --token 8e8iei.lh8gumyd8ap7kgtz --discovery-token-ca-cert-hash sha256:84f7d6aeec39dc6efe60db6c82f8d97dc220c96e6455a1710c17daa060ef9300 --ignore-preflight-errors=SystemVerification

第二个worker也如法炮制。
顺利的话可以在master节点上看到三个node了。

1# kubectl get node
2NAME        STATUS   ROLES    AGE   VERSION
3test-vm     Ready    master   28m   v1.13.4
4test-vm-1   Ready    <none>   51s   v1.13.4
5test-vm-2   Ready    <none>   61s    v1.13.4