K8S系列——Kubeadmin 方式部署k8s
本文最后更新于 538 天前,如有失效请评论区留言。

kubeadm 方案部署

服务器要求:3台服务器

服务名 ip 配置
k8s-master 192.168.200.199 最低配置:2C 2G 20G
k8s-node1 192.168.200.210 最低配置:2C 2G 20G
k8s-node2 192.168.200.211 最低配置:2C 2G 20G

最好能联网,不能联网的话需要有提供镜像的私有仓库,操作会非常复杂。

软件环境

  1. 操作系统:CentOS 7

  2. Docker: 20+

  3. k8s:1.23.6,公司里不会追求最新的版本,因为没有经过市场的检验。

  4. k8s在1.24版本以后,正式宣布不支持docker。docker 跟 k8s 是相辅相成的,在CNCF云原生组织中,k8s在极力推行CRI规范,但docker不支持这个规范。所以我们还是选择1.23这个版本。docker当前在市场的占有比例高,而且docker自己在推行CRI的版本,待docker推出该版本后就可以继续使用docker作为container runtime。

系统初始化

1、关闭防火墙

# systemctl stop firewalld
# systemcctl disable firewalld

2、关闭selinux

# sed -i 's/enforcing/disabled/' /etc/selinux/config
# setenforce 0

3、关闭swap

关闭swap后,一定要重启一下虚拟机!!! free -g 验证,swap必须为0

# swapoff -a
# sed -ri 's/.*swawp.*/#&/' /etc/fstab

4、根据规划设置主机名

# hostnamectl set-hostname <hostname>

5、在master中添加hosts

#cat >>/etc/hosts <<EOF
192.168.200.199 k8s-master
192.168.200.210 k8s-node1
192.168.200.211 k8s-node2
EOF

6、将桥接的IPV4流量传递到iptables的链

# cat > /etc/sysctl.d/k8s.conf<<EOF
net.bridge.birdge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# sysctl --system        #加载生效

问题:遇见提示是只读的文件系统,运行如下命令:

# mount -o remount rw /

7、时间同步

# yum install -y chronyd
# systemctl start chronyd

安装基础软件(所有节点)

安装docker

1、卸载系统自带的docker旧版本

# yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2、安装必须的依赖

# yum -y install gcc
# yum -y install gcc-c++
# yum install -y yum-utils

3、下载Docker

推荐使用国内镜像仓库,主要还是因为国内网络限制,我们无法直接访问Docker官网

# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# yum makecache fast
# yum install -y docker-ce docker-ce-cli containerd.io
# vim  /etc/docker/daemon.json
{
  "registry-mirrors": ["https://skg9ytev.mirror.aliyuncs.com"]
}
# systemctl daemon-reload
# systemctl start docker
# docker version

添加K8s的国内yum

# cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安装kubeadmin,kubelet,kubectl

k8s在1.24版本以后,正式宣布不支持docker,所以这里部署一个低版本。

在所有节点部署:

# yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
# systemctl anable kubelet

部署kubernetes master

由于默认拉取镜像的地址 k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。可以手动按照 images.sh 先拉取镜像。地址变更为 registry.aliuncs.com/google_containers也可以。
在主节点上执行:(确认docker是否已经关掉cgroup,否则需要先执行后续步骤再初始化)

# kubeadm init \
--apiserver-advertise-address=192.168.200.210 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.23.6 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

# kubeadm join 192.168.200.210:6443 --token q2liy1.xw78m049gt3n69n2 \
    --discovery-token-ca-cert-hash sha256:2f2e8322b8274022424bcfc701d2a169332150a9063e5f41b88b782ec4b97a43

这里有几个坑:

1、初始化失败之后再次执行初始化操作会报错,需要重置后才能再次初始化 kubeadm reset
2、kubelet 要求必须关闭cgroup,即要求将cgroups disabled。因为docker默认使用的Cgroup Drivercgroupfs,所以启动时一直报错。

报错:- The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)

这个与docker的一个配置有关系,docker默认使用的Cgroup Drivercgroupfs,将其修改成systemd

修改方法:在docker的配置文件中,添加如下一段内容(如果有其他配置选项也可以添加到花括号之中,存在多个配置时,记得每行配置的最后要加上一个逗号,这是json的语法格式要求)

# vim /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"]
}

重启docker让配置生效,查看docker的配置信息

# systemctl daemon-reload
# systemctl restart docker
# docker info | grep  Driver

重置主节点

# kubeadm reset

再次进行kubadm初始化master节点时,就不会有报错了~

可以动态查看kubelet的日志

# journalctl -xefu kubelet

会看到未认证的报错,但可以暂时不用管。因为没有集群,没有当前用户,所以没有认证信息

执行以下命令:

# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config

k8s node加入集群

k8s master初始化成功后,在node节点上执行加入命令,命令中有两个参数需要手动填写,这两个参数初始化时会在日志中打印。

 格式:
 # kubeadm join 192.168.200.210:6443 --token <master 控制台token>\
 --discovery-token-ca-cert-hash <master 控制台 hash>
 命令:
 # kubeadm join 192.168.200.210:6443 --token q2liy1.xw78m049gt3n69n2 \
--discovery-token-ca-cert-hash sha256:2f2e8322b8274022424bcfc701d2a169332150a9063e5f41b88b782ec4b97a43

如果初始化完成后不小心清空了日志,也可以通过如下命令重新获取token。

如果token已经过期,就重新申请。

# kubeadm token create

如果token没有过期,可以直接查询

# kubeadm token list

下面这个命令可以获取 --discovery-token-ca-cert-hash 值,然后在得到值后需要在前面拼接 sha256,组成加入集群需要的第二个参数。

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

节点加入集群后,查看集群节点

[root@k8s-node1 .kube]# kubectl get nodes
NAME        STATUS     ROLES                  AGE     VERSION
k8s-node1   NotReady   control-plane,master   35m     v1.23.6
k8s-node2   NotReady   <none>                 3m58s   v1.23.6

可以看到节点已经加入了集群,但是节点的状态是NotReady,集群还是不能使用,原因是集群缺少网络插件。下面来解决这个问题。

部署CNI网络插件

所有节点都需要下载cni的相关镜像,CNI镜像可以用 calico 或者 flano 镜像,这里选择calico镜像。

如果是直接yaml在线构建,只需要在masterdeply,其他节点会同步执行;

如果是离线构建,所有节点都需要上传相关CNI镜像.(由于我下载镜像一直存在问题,因此采用离线构建的方式)。不过这里还是先介绍在线构建的步骤。

在线构建

1、查看组件状态

[root@k8s-node1 .kube]# kubectl get componentstatus
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE                         ERROR
controller-manager   Healthy   ok                              
scheduler            Healthy   ok                              
etcd-0               Healthy   {"health":"true","reason":""} 
[root@k8s-node1 .kube]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE                         ERROR
scheduler            Healthy   ok                              
controller-manager   Healthy   ok                              
etcd-0               Healthy   {"health":"true","reason":""} 

2、查看pod,不指定命名空间则会查询默认命名空间的pod

[root@k8s-node1 .kube]# kubectl get pods
No resources found in default namespace.
[root@k8s-node1 .kube]# kubectl get pods -n kube-system
NAME                                READY   STATUS    RESTARTS   AGE
coredns-65c54cc984-6955w            0/1     Pending   0          40m
coredns-65c54cc984-nfrcp            0/1     Pending   0          40m
etcd-k8s-node1                      1/1     Running   0          41m
kube-apiserver-k8s-node1            1/1     Running   0          41m
kube-controller-manager-k8s-node1   1/1     Running   0          41m
kube-proxy-b5qk6                    1/1     Running   0          9m46s
kube-proxy-mx9rw                    1/1     Running   0          40m
kube-scheduler-k8s-node1            1/1     Running   0          41m

3、接下来开始部署CNI

这里看到,有两个组件是pending状态,没有下载下来,所以问题就出在这两个组件。

下载方式1;
# curl https://docs.projectcalico.org/manifests/calico.yaml -O
下载方式2:
# wget https://docs.projectcalico.org/manifests/calico.yaml

修改calico.yaml 文件中的CALICO_IPV4POOL_CIDRcidr配置,修改为跟master初始化配置的 cidr相同

  - name: CALICO_IPV4POOL_CIDR
    value: "10.244.0.0/16"

新版本没有这个参数了:修改 IP_AUTODETECTION_METHOD 下的网卡名称

4、删除镜像 docker.io/前缀,避免从国外镜像站下载下得过慢导致失败

[root@k8s-node1 k8s]# grep image calico.yaml 
          image: docker.io/calico/cni:v3.25.0
          imagePullPolicy: IfNotPresent
          image: docker.io/calico/cni:v3.25.0
          imagePullPolicy: IfNotPresent
          image: docker.io/calico/node:v3.25.0
          imagePullPolicy: IfNotPresent
          image: docker.io/calico/node:v3.25.0
          imagePullPolicy: IfNotPresent
          image: docker.io/calico/kube-controllers:v3.25.0
          imagePullPolicy: IfNotPresent
[root@k8s-node1 k8s]# sed -i 's#docker.io/##g' calico.yaml
[root@k8s-node1 k8s]# grep image calico.yaml 
          image: calico/cni:v3.25.0
          imagePullPolicy: IfNotPresent
          image: calico/cni:v3.25.0
          imagePullPolicy: IfNotPresent
          image: calico/node:v3.25.0
          imagePullPolicy: IfNotPresent
          image: calico/node:v3.25.0
          imagePullPolicy: IfNotPresent
          image: calico/kube-controllers:v3.25.0
          imagePullPolicy: IfNotPresent

5、先将镜像拉取下来,执行yaml文件的时候就会快一些。也可以检查是不是可以正常拉取到这些镜像

[root@k8s-node1 k8s]# docker pull calico/cni:v3.25.0  
[root@k8s-node1 k8s]# docker pull calico/cni:v3.25.0
[root@k8s-node1 k8s]# docker pull calico/node:v3.25.0
[root@k8s-node1 k8s]# docker pull calico/node:v3.25.0
[root@k8s-node1 k8s]# docker pull calico/kube-controllers:v3.25.0

6、用yaml文件构建pod

[root@k8s-node1 k8s]# kubectl apply -f calico.yaml

如果需要回退,则可以根据yaml文件删除pod

[root@k8s-node1 k8s]# kubectl delete -f calico.yaml
离线构建

这里因为网络,我实在是下不下来,于是选择尝试离线安装的方式,calico下载地址

image-20240607091325371

1、下载calico离线安装包

访问 calico下载地址,下载k8s需要的release包,然后从中解压得到镜像文件上传到服务器,再载入docker镜像(k8s的所有节点都需要)。
这里只需要上传calico-cni.tar calico-kube-controllers.tar calico-node.tar3个文件就可以了(在./release-v3.25.0/images/下)

image-20240711163953231

2、离线镜像导入docker镜像

[root@k8s-node1 k8s]# docker load -i calico-cni.tar
[root@k8s-node1 k8s]# docker load -i calico-node.tar
[root@k8s-node1 k8s]# docker load -i calico-kube-controllers.tar

3、主节点执行yaml文件,为k8s安装calico

[root@k8s-node2 k8s]# kubectl apply -f calico.yaml

4、注意

只有具有上述三个calico镜像的节点,状态是running,如果节点上没有calico镜像,则会一直处于Init:ImagePullBackOff状态

[root@k8s-node1 k8s]# kubectl get pod -n kube-system
NAME                                     READY   STATUS                  RESTARTS      AGE
calico-kube-controllers-cd8566cf-jbkq8   0/1     ContainerCreating       0             8m44s
calico-node-2qj6w                        1/1     Running                 0             8m45s
calico-node-z7lbm                        0/1     Init:ImagePullBackOff   0             8m45s
coredns-65c54cc984-6955w                 1/1     Running                 0             12h
coredns-65c54cc984-nfrcp                 1/1     Running                 0             12h
etcd-k8s-node1                           1/1     Running                 0             12h
kube-apiserver-k8s-node1                 1/1     Running                 0             12h
kube-controller-manager-k8s-node1        1/1     Running                 1 (22m ago)   12h
kube-proxy-b5qk6                         1/1     Running                 1             11h
kube-proxy-mx9rw                         1/1     Running                 0             12h
kube-scheduler-k8s-node1                 1/1     Running                 2 (20m ago)   12h

当所有节点状态都为running后,calico-kube-controllers才会运行成功

[root@k8s-node1 k8s]# kubectl get pod -n kube-system
NAME                                     READY   STATUS    RESTARTS      AGE
calico-kube-controllers-cd8566cf-jbkq8   1/1     Running   0             9m54s
calico-node-2qj6w                        1/1     Running   0             9m55s
calico-node-z7lbm                        1/1     Running   0             9m55s
coredns-65c54cc984-6955w                 1/1     Running   0             12h
coredns-65c54cc984-nfrcp                 1/1     Running   0             12h
etcd-k8s-node1                           1/1     Running   0             12h
kube-apiserver-k8s-node1                 1/1     Running   0             12h
kube-controller-manager-k8s-node1        1/1     Running   1 (23m ago)   12h
kube-proxy-b5qk6                         1/1     Running   1             11h
kube-proxy-mx9rw                         1/1     Running   0             12h
kube-scheduler-k8s-node1                 1/1     Running   2 (21m ago)   12h

taint 和 tolerations

taint : 污点
tolerations:容忍
这两个概念后续会详细介绍

测试 kubernetes 集群

创建Nginx容器

# kubectl create deployment nginx --image=nginx

暴露容器端口

# kubectl expost deployment nginx --port=80 --type=NodePort

查看pod及服务信息

[root@k8s-node1 k8s]# kubectl get pod,svc
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-85b98978db-nsdbh   1/1     Running   0          3m8s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        15h
service/nginx        NodePort    10.100.144.72   <none>        80:32219/TCP   21s

容器nginx的80端口,就被暴露为node的32219端口了。注意,这里可以暴露到所有节点,这个操作由kube-proxy完成。

版权声明:除特殊说明,博客文章均为cuckooyang原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。 | 博客订阅:RSS | 广告招租:留言板 | 博客VPS |
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇