按官方文档部署kubernetes -- 用kubeadm 部署单个Master单节点的kubernetes Cluster

最近,在部署kubernetes。发现kubernetes的官方文档做得非常好。文档是按软件版本来划分的,每个版本,还会对应不同的add-on版本(比如calico的版本),真是太仔细了。这个文档中,我用的是目前最新的kubernetes 1.16.1的版本。先上一个用官方的kubeadm 1.16.1 工具部署一个单节点master的方法。安装可以按官方文档进行,比较简单的,这里会给出一些部署时的注意点,为后面部署高可用master 节点做准备。

Server Lists

Server77  Ubuntu 18.04LTS (Master)
Server78  Ubuntu 18.04LTS (Node)
Server79  Ubuntu 18.04LTS (Node)

one contral-plane diagram structure

下面是用kubeadm安装的只有一个master node 的kubernetes 架构图

Installing Container runtimes

  1. 官方文档中的Container runtimes 有Docker/CRI-O/Containerd/frakti,我们这边就用我们最熟悉的Docker。
  2. 安装脚本如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    # Install Docker CE
    ## Set up the repository:
    ### Install packages to allow apt to use a repository over HTTPS
    apt-get update && apt-get install apt-transport-https ca-certificates curl software-properties-common
    ### Add Docker’s official GPG key
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
    ### Add Docker apt repository.
    add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
    ## Install Docker CE.我这边安装了docker-ce=18.09.6版本
    #apt-get update && apt-get install docker-ce=18.06.2~ce~3-0~ubuntu
    apt-get update && apt-get install docker-ce=18.09.6~3-0~ubuntu-bionic
    # Setup daemon.
    cat > /etc/docker/daemon.json <<EOF
    {
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver": "json-file",
    "log-opts": {
    "max-size": "100m"
    },
    "storage-driver": "overlay2"
    }
    EOF

    mkdir -p /etc/systemd/system/docker.service.d

    # Restart docker.
    systemctl daemon-reload
    systemctl restart docker

我这边安装了docker-ce=18.09.6版本,按官方文档说明,Version 18.06.2 is recommended, but 1.11, 1.12, 1.13, 17.03 and 18.09 are known to work as well.,docker-ce 18.09.x版本是也可以用的。如果安装这个版本,还会同时安装containerd。在两个都存在的情况下,默认kuberenets会使用docker作为 Container Runtime.

installing kubeadm (current version 1.16.1)

  1. 系统配置要求2GBMEM/2CPU
  2. 操作系统支持Ubuntu16.04+/Debin9+/CentOS7(8不支持)/REHL7(8不支持)/Fedora25+/HyprioOSv1.0.1+
  3. 集群中每台机器可以通过网络完全访问
  4. 唯一的主机名、MAC、product_uuid
  5. 要disable Swap
  6. iptables的内核后端模块要用iptables而不用要用最新的nftables,目前kubeadm 不支持nftables 作为backend的iptables.这也是为什么目前kubeadm不支持RHEL8和Centos8的原因。
  7. 安装 kubeadm/kubelet/kubectl

    1
    2
    3
    4
    5
    6
    7
    curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
    cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
    deb https://apt.kubernetes.io/ kubernetes-xenial main
    EOF
    apt-get update
    apt-get install -y kubelet kubeadm kubectl
    apt-mark hold kubelet kubeadm kubectl
  8. 最后,一般kubeamd 会自动识别Docker使用的是systemd的cgroup还是自带的cgroup,并放到/var/lib/kubelet/kubeadm-flags.env文件中。如果使用docker外的其它 CRI,就要更改 /etc/default/kubelt中的配置,增加并更改下面的内容:

    1
    2
    # value is systemd or cgroup
    KUBELET_EXTRA_ARGS=--cgroup-driver=value

kubeadm init on master node

  1. 可用用下面的kubeadm init命令部署kubernetes的master node 上的程序,准确的说,是部署了多个提供kubernetes服务的docker 容器。

    1
    kubeadm init --image-repository registry.aliyuncs.com/google_containers --control-plane-endpoint "cp.xxx.com:6443" --pod-network-cidr=192.168.0.0/16
  2. 建议用–control-plane-endpoint 参数指定apiserver的域名和端口,好处是后面如果要做kubernetes master node的HA,会有多个apiserver 服务器,可以用DNS做轮询或用HAproxy 做负载均衡。用域名加端口就不用在后面去改证书。kubernetes 为提升安全性,内部相互访问都会使用证书认证,这些证书会绑定IP或域名,如果直接用IP地址,后面改动–control-plane-endpoint中的IP指向,会要重新生成这些证书,而用域名就没有这个问题了,可以随时改动域名指向的IP。

  3. 我使用了calico 这个pod network add-on,所以使用 –pod-network-cidr=192.168.0.0/16 参数。
  4. 可以用 –cri-socket 来指定 不同的CRI,这里用默认值,也就是docker.
  5. 可以用 –apiserver-advertise-address 来指在master node有多个网卡时,指定使用的网卡IP,默认是defalut GW的网卡。
  6. 可以用–image-repository registry.aliyuncs.com/ 这个设置阿里云做镜像下载站点,可以加速下载速度,减少部署时间

用上面的命令安装完成后,就可以根据命令完成后最后几行的提示 请保存命令行输出的最后几行kubeadm join的内容,后会在 join node或join contral plane会使用,进行设置:
设置kubectl 这个命令行管理工具的配置文件:

1
2
3
4
5
6
# users
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# root
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile

installing a pod network add-on

下面就是要安装Container Network Interface(CNI),这是必须的,不然Master Node 会处于NotReady状态,无法部署任何应用。也就是要先安装CNI才能部署pod.
用下面的命令,可以查看刚部署的master node的状态:

1
2
3
root@server77:~# kubectl get node
NAME STATUS ROLES AGE VERSION
server77 NotReady master 42h v1.16.1

我这里选择使用Calico,部署命令如下:

1
2
3
# 我这里选择了最新的3.9版本,在kubernetes1.16.1上运行没有问题
#kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml
kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml

安装完成Calico CNI后,再次查看,master node 的状态已经恢复为Ready

1
2
3
root@server77:~# kubectl get node
NAME STATUS ROLES AGE VERSION
server77 Ready master 42h v1.16.1

可以使用下面的命令,让master node 上也可以分配pod

1
kubectl taint nodes --all node-role.kubernetes.io/master-

这时,用下面的命令查看,会发现Coredns 这个pod会处理Running状态了

1
kubectl get pod --all-namespaces

Joining your nodes

上面在运行kubeadm init 生成的最后的几行输出内容中,会有kubeadm join命令,这个就是把一台node 加入kubernetes中的命令。

按文章开始installing kubeadm方法在其它 Nodes 上安装完成kubeadm/kubelet/kubectl后,就可以复制上面的kubeadm join命令来把Node 加入kubernetes中了。

1
root@server78:~# kubeadm join cp.xxx.com:6443 --token ap9hs3.rvq3cjfu3pxxxxxx   --discovery-token-ca-cert-hash sha256:c3362088e1c997102750d395d9c775b84d5eae578f87b198527383dexxxxxxxxx

记得把Calico的CNI给部署上:

1
root@server78:~# kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml

注意: 在node上部署完Calico后,你会发现,你的Node还是处理NotReady状态。解决这个问题花了我好几天的时间,原因是Ubuntu18.04LTS系统上的apparmor, 还请在所有的node上关闭下面的apparmor:

1
2
3
4
aa-status
cd /etc/apparmor.d/disable
ln -s ../lxc-containers
ln -s ../usr.bin.lxc-start

在完成上面部署后,就可以用下面的命令查看整个kubernetes的状态了:

1
2
3
4
5
root@server77:~/kubeadmin# kubectl get node
NAME STATUS ROLES AGE VERSION
server77 Ready master 43h v1.16.1
server78 Ready node 42h v1.16.1
server79 Ready node 42h v1.16.1

部署完成的这个kubernetes cluster,有一个master节点,两个node节点,是一个非HA的kubernetes cluster.如果master node 挂了,整个cluster就挂了。后面,我会用这三台机器重新建一个HA的kubernetes cluster,由三个master node组成,三个master node中任意关闭期中一台,都不会影响整个kubernetes cluster的正常运行。同时,这三台master node 也设置成可以用来分配pod。

坚持原创技术分享,您的支持将鼓励我继续创作!