使用kubeadm安装k8s集群(Ubuntu Server 18.10)

系统环境:#

  • 环境:KVM 虚拟机;
  • 操作系统:Ubuntu server 18.10
  • 节点:
    1. K8s-master 192.168.31.80
    2. K8s-node1 192.168.31.81
    3. K8s-node2 192.168.31.82
    4. K82-node3 192.168.31.83

准备工作:#

  1. 所有节点配置 /etc/hosts, 每个节点能通过 hostname 互通(ping);
  2. 配置所有节点免密互登;
  3. 所有节点安装docker,并且为 docker 配置科学上网;
  4. 所有节点配置 apt 科学上网并安装 kubeadm kubelet, 主节点(k8smaster)还需安装kubectl;

生成证书:#

生成证书是为了把允许远程访问的主节点地址加入证书,否则无法通过 kubectl 或 helm 远程管理集群.

1
2
3
4
5
6
7
8
9
10
11
kubeadm init phase certs all \
--apiserver-advertise-address=0.0.0.0 \
--apiserver-cert-extra-sans=\
10.96.0.1,\
192.168.31.80,\
k8s.xxxxxxxx.io,\
k8s-master,\
kubernetes,\
kubernetes.default,\
kubernetes.default.svc,\
kubernetes.default.svc.cluster.local

预拉取镜像文件#

在每个节点执行以下命令:

1
kubeadm config images pull

上述命令会自动调用 docker 下载以下镜像,如果 docker 不能科学上网会失败,需要为 Docker 配置 Proxy。

k8s.gcr.io/kube-apiserver
k8s.gcr.io/kube-controller-manager
k8s.gcr.io/kube-scheduler
k8s.gcr.io/kube-proxy
k8s.gcr.io/pause
k8s.gcr.io/etcd
k8s.gcr.io/coredns

初始化主节点#

1
kubeadm init --pod-network-cidr=10.244.0.0/16

参数--pod-network-cidr=10.244.0.0/16是 安装网络组件Flannel所必须的,不同的网络组件参数值不同,具体参考:https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#pod-network;

执行上述命令后发生了什么?

  1. 自动调用上一节所述的命令 kubeadm config images pull 拉取镜像文件;
  2. 逐一使用这些镜像启动容器;
  3. 会输出一个让节点加入集群的命令(以下命令不能直接复制执行,因为每次执行kubeadm init 所生成的 token 是不一样的,请直接从您执行 kubeadm init 命令后的输出结果里复制),这个命令后续会用到,请记下来:
1
kubeadm join 192.168.31.80:6443 --token  xxxxxxxxxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

其中 token 默认有效期为24小时, 如果过期重新生成新的 token 请使用此命令:

1
2
3
4
5
6
$ kubeadm token create

-- output: --------------------------------

TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
xxxxxx.xxxxxxxxxxxxxxxx 22h 2018-12-17T14:58:01+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token

查看可用的 Token: kubeadm token list;

获取ca证书sha256编码hash值:

1
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

执行完毕后使用此命令检查k8s-master 状态:

1
kubectl get pods --kube-system -o wide

输出结果:

1
2
3
4
5
6
7
8
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE   IP              NODE         NOMINATED NODE   READINESS GATES
kube-system coredns-86c58d9df4-tfghj 0/1 Pending 0 79s 10.244.0.79 k8s-master <none> <none>
kube-system coredns-86c58d9df4-tfqjm 0/1 Pending 0 79s 10.244.0.78 k8s-master <none> <none>
kube-system etcd-k8s-master 1/1 Running 0 24s 192.168.31.80 k8s-master <none> <none>
kube-system kube-apiserver-k8s-master 1/1 Running 0 33s 192.168.31.80 k8s-master <none> <none>
kube-system kube-controller-manager-k8s-master 1/1 Running 0 18s 192.168.31.80 k8s-master <none> <none>
kube-system kube-proxy-4jqjk 1/1 Running 0 79s 192.168.31.80 k8s-master <none> <none>
kube-system kube-scheduler-k8s-master 1/1 Running 0 19s 192.168.31.80 k8s-master <none> <none>

其中前面两个 pod 一直处于 Pending 状态,这是因为还没有为集群安装网络组件,等下一步安装完 Flannel 组件后就会变成 Running 状态;

安装网络组件 Flannel#

在主节点执行以下命令:

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

执行完毕后会自动启动一个名为kube-flannel-ds-amd64-xxxxx的 pod,并且 coredns-xxxxxxxxx-xxxxx 状态会变成 Running 状态。

至此,k8s-master 节点配置完毕,接下来 将另外三个node节点加入集群:

分别在另外三个节点(k8s-node1, k8s-node2, k8s-node3)上执行以下命令:

1
kubeadm join 192.168.31.80:6443 --token  xxxxxxxxxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

执行完毕后,在 k8s-master 节点上使用以下命令就能看到节点状态:

1
2
3
4
5
6
7
8
kubectl get nodes

---output: ------------------------------------------

NAME STATUS ROLES AGE VERSION
k8s-master Ready master 118m v1.13.1
k8s-node1 Ready <none> 77s v1.13.1
k8s-node2 Ready <none> 43s v1.13.1