CKAD认证中的部署教程
在上一章中,我们已经学会了使用 kubeadm 创建集群和加入新的节点,在本章中,将按照 CKAD 课程的方法重新部署一遍,实际上官方教程的内容不多,笔者写了两篇类似的部署方式,如果已经部署了 kubernetes 集群,则本章的内容可跳过。
本文为作者的 Kubernetes 系列电子书的一部分,电子书已经开源,欢迎关注,电子书浏览地址:
https://k8s.whuanle.cn【适合国内访问】
https://ek8s.whuanle.cn 【gitbook】
部署
预设网络
本节主要是配置 hosts 文件,在后续配置中,通过主机名称即可快速连接,而不需要每次都打上 IP 地址。
我们在 Master 节点服务器执行 ip addr
命令,找到 ens4
,把里面提到的 ip 记录下来。
ens4: mtu 1460 qdisc mq state UP group default qlen 1000
link/ether 42:01:0a:aa:00:02 brd ff:ff:ff:ff:ff:ff
inet 10.170.0.2/32 scope global dynamic ens4
valid_lft 2645sec preferred_lft 2645sec
inet6 fe80::4001:aff:feaa:2/64 scope link
valid_lft forever preferred_lft forever
如上述 ip 是 10.170.0.2。或者使用
hostname -i
查询。方式有很多,目前是获得主机的内网 IP。然后修改
/etc/hosts
文件,加上一行(替换这个ip为你的):10.170.0.2k8smaster
【CKAD认证中的部署教程】后面我们访问集群,使用 k8smaster 这个主机名称(域名),而且不是需要 IP 地址,使用主机名称方便记忆,也避免了 IP 强固定。
kubeadm 安装 k8s
这里的部署过程跟上一章中的有所差异,因为上章中,直接使用
kubeadm init
进行初始化集群,没有配置更多细节。执行
kubectl version
查看 k8s 版本,找到这段GitVersion:"v1.21.0"
,即为 Kubernetes 版本。创建一个 kubeadm-config.yaml 文件,我们使用
kubeadm init
时,通过此配置文件出初始化 k8s master。文件内容为:
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubenetesVersion: 1.21.0
controlPlaneEndpoint: "k8smaster:6443"
networking:
podSubnet: 192.168.0.0/16
注意,
:
后面必须带一个空格。表示key: value
。例如 image: nginx:letest
,不带空格的 :
会连在一起。然后通过配置文件初始化 Master:
kubeadm init --config=kubeadm-config.yaml --upload-certs --v=5 | tee kubeadm-init.out
# 可省略为 kubeadm init --config=kubeadm-config.yaml --upload-certs
--v=5
可以输出更多信息信息,tee xxx
可以让信息输出到一个文件中,方便收集日志或者后续检查。执行初始化命令后,终端或查看
kubeadm-init.out
文件,有以下内容:To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.confYou should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/You can now join any number of the control-plane node running the following command on each as root:kubeadm join k8smaster:6443 --token 45td1j.xqdscm4k06a4edi2 \
--discovery-token-ca-cert-hash sha256:aeb772c57a35a283716b65d16744a71250bcc25d624010ccb89090021ca0f428 \
--control-plane --certificate-key d76287ccc4701db9d34e0c9302fa285be2e9241fc43c94217d6beb419cdf3c52Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours;
If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.Then you can join any number of worker nodes by running the following on each as root:kubeadm join k8smaster:6443 --token 45td1j.xqdscm4k06a4edi2 \
--discovery-token-ca-cert-hash sha256:aeb772c57a35a283716b65d16744a71250bcc25d624010ccb89090021ca0f428
按照提示,我们逐个执行下面的命令,不要一次性粘贴执行,因为
cp -i
表示要你输入 y/n
确认更改,一次性粘贴会导致跳过(把 -i 改为 -f 也行)。mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
然后:
export KUBECONFIG=/etc/kubernetes/admin.conf
笔者注:
KUBECONFIG
环境变量在下次登录或新建终端窗口会失效,打开 用户目录的.bashrc
文件,在最后面加上 export KUBECONFIG=/etc/kubernetes/admin.conf
,可保证下次登录或切换终端,依然可用。笔者注:因为涉及到多用户,所以如果切换用户,就不能使用
kubeadm/kubectl/kubelet
命令了,如果读者切换了用户,则可以执行上面 make -p $HOME/.kube
到 export xxx
这两部分的命令,这样别的用户也可以执行命令操作节点。输入
kubeadm config print init-default
可以查看到 master 初始化时配置。以上便是 CKAD 官方的部署方法。
配置 Calico 什么是 CNI CNI 意为容器网络接口,是 Kubernetes 的一种标准设计,使用者可以不需要关注使用了何种网络插件,可以在插件或销毁容器时更加容易地配置网络。
Kubernetes 中有 Flannel、Calico、Weave 等主流的插件,在上一篇中,我们部署 Kubernetes 网络时,使用了 Weave,而在本章中,我们将使用 Calico 来部署网络。
对于 CNI ,后面的章节会深入学习。
Calico(https://github.com/projectcalico/calico) 是针对容器、虚拟机和裸机工作负载的开源网络和安全解决方案,它提供了 Pod 之间的网络连接和网络安全策略实施。
Flannel、Calico、Weave 都是常用的 Kubernetes 网络插件,读者可参考 https://kubernetes.io/zh/docs/concepts/cluster-administration/networking/ 这里不做过多的说明。
首先下载 Calico 的 yaml 文件。
wget https://docs.projectcalico.org/manifests/calico.yaml
然后我们需要留意 yaml 文件中的
CALICO_IPV4POOL_CIDR
的值,读者直接打开 https://docs.projectcalico.org/manifests/calico.yaml 或者使用 less calico.yaml
在终端上阅读文件。找到
CALICO_IPV4POOL_CIDR
例如:# - name: CALICO_IPV4POOL_CIDR
#value: "192.168.0.0/16"
这个表示 ip4 池,如果 ip 不存在,则会自动创建,创建 的 pod 的网络 ip 会在这个范围。默认是
192.168.0.0
我们不需要改,如果你需要定制,则可以删除 #
,然后改动 ip。[Error] 提示然后我们启用 Calico 网络插件:
请务必根据你集群中的 IP 段,配置此参数。
kubectl apply -f calico.yaml
当网络配置完成后,即可使用
kubeadm join
加入节点。其它 在节点上执行命令
如果我们在 Worker 节点上执行命令,会发现:
root@instance-2:~# kubectl describe nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?
首先在 Master 节点中,下载
/etc/kubernetes/admin.conf
文件,或者复制文件内容,到 Worker 节点中。将文件上传或复制到 Worker 节点的
/etc/kubernetes/admin.conf
文件,执行配置即可。mkdir -p $HOME/.kube
sudo cp -f /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> $HOME/.bashrc
自动补全工具
kubectl
命令和可选参数非常多,每次都要敲长长的命令,容易出错,我们可以利用 bash-completion
为我们快速完成命令的输入。sudo apt-get install bash-completion -y
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> $HOME/.bashrc
当我们敲命令时,按下 TAB 键,会自动补全。
输入
kubectl des
,然后按一下 TAB
键,会发现内容自动补全为 kubectl describe
。状态描述
执行
kubectl describe nodes
/命令,我们可以看到节点详细的信息,其中有个 Conitions
字段,描述了所有正在运行中(Running) 的节点的状态,它有 5 个字段或类型:- Ready
Node 是否能够接收 pod ,如果可以则Status
为 True;如果节点不健康,不能接收 pod,则 为 False。正常情况下为 True。
- DiskPressure
表示节点的空闲空间不足以用于添加新 Pod,如果为 True则说明不正常。
- MemoryPressure
表示节点存在内存压力,即节点内存可用量低,如果为 True 则说明不正常。
- PIDPressure
表示节点存在进程压力,即节点上进程过多;如果为 True 则说明不正常。
- NetworkUnavailable
表示节点网络配置不正确;如果为 True,则说明不正常。
"conditions": [
{
"type": "Ready",
"status": "True",
"reason": "KubeletReady",
"message": "kubelet is posting ready status",
"lastHeartbeatTime": "2019-06-05T18:38:35Z",
"lastTransitionTime": "2019-06-05T11:41:27Z"
}
]
读者可参考:https://kubernetes.io/zh/docs/concepts/architecture/nodes/
本章内容主要介绍了 CKAD 认证中要求掌握的 kubeadm 部署 k8s 、配置启动 Calico 网络插件,跟上一篇的内容比较,主要是通过 yaml 文件去控制创建 kubernetes 集群,两章的部署过程一致,只是网络插件有所不同。
推荐阅读
- 热闹中的孤独
- JS中的各种宽高度定义及其应用
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- Android中的AES加密-下
- 放下心中的偶像包袱吧
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- 如何在Mac中的文件选择框中打开系统隐藏文件夹