个人随笔
目录
k8s集群环境搭建
2023-02-23 10:22:09

下面进行k8s环境的搭建,当然我是在自己本地电脑的虚拟机搭建的,并且每个节点分配了4G的内存,我电脑共16G内存,三个节点就占据了12G,卡卡的,但是没办法,总不能用云服务器吧,不过貌似用云服务器也是可以的,按量计费,搭建完也费不了多少钱吧,练习完后就删掉即可。

讲真下面已经是我第二次搭建了,第一次搭建,虽然控制台进去了,但是在一个节点竟然不能访问另一个节点的pod,pod和service在集群中不是可以肆意的访问么?网上查可能是因为Pod CIDR与节点IP冲突,Calico的Pod CIDR即—pod-network-cidr默认使用的是192.168.0.0/16,而当集群节点的IP段也为192.168.0.0/16时,必然导致IP段冲突,由于不会在搭建好后重新修改这些配置,所以只能重新搭建了。

一、环境准备

1、相关版本

  1. Linux CentOS7 64
  2. docker20.10.7
  3. kubelet1.20.9
  4. kubeadm1.20.9
  5. kubectl1.20.9

2、虚拟机准备

我是准备搭建三个节点的集群,毕竟本地虚拟机,配置比较弱,linux内存都是给的4G,已经是我能给的极限了,大家有条件的可以用8G。目前规划下面几个IP。

  1. k8s-new-master:192.168.192.8
  2. k8s-new-node1:192.168.192.9
  3. k8s-new-node2:192.168.192.10

这里虚拟机的搭建可以参考我如下几篇笔记

安装VMware15
CentOS7镜像官网下载
VMWare安装CentOS7超全图解
最小系统Centos7进行网络配置以及 ifconfig和vim的安装
VMWare 克隆Linux虚拟机

3、安装好后先克隆三台机器

密码都是root/forever、内存都是4G、然后参考上面的笔记修改好对应的ip地址。弄好后最好做个快照,防止后面操作失败可以恢复快照重新来过(我就是master节点忘记设置host本身的k8s-new-master导致重新来过了)。

二、k8s集群搭建

1、先安装好docker

1-1、卸载以前的docker包,这个步骤正常新的linux不用执行
  1. sudo yum remove docker \
  2. docker-client \
  3. docker-client-latest \
  4. docker-common \
  5. docker-latest \
  6. docker-latest-logrotate \
  7. docker-logrotate \
  8. docker-engine
1-2、配置好yum源
  1. sudo yum install -y yum-utils
  2. sudo yum-config-manager \
  3. --add-repo \
  4. http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1-3、安装docker,我们选择固定版本
  1. yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6

在加入节点的时候会报警告说版本不对,其实可以不用理会,如果有强迫症可以用下面的版本

  1. yum install -y docker-ce-19.03.0 docker-ce-cli-19.03.0 containerd.io-1.4.6

如果用默认版本就用这个

  1. sudo yum install -y docker-ce docker-ce-cli containerd.io
1-4、启动docker
  1. systemctl enable docker --now
1-5、配置加速
  1. sudo mkdir -p /etc/docker
  2. sudo tee /etc/docker/daemon.json <<-'EOF'
  3. {
  4. "registry-mirrors": ["https://970k7x82.mirror.aliyuncs.com"],
  5. "exec-opts": ["native.cgroupdriver=systemd"],
  6. "log-driver": "json-file",
  7. "log-opts": {
  8. "max-size": "100m"
  9. },
  10. "storage-driver": "overlay2"
  11. }
  12. EOF
  13. sudo systemctl daemon-reload
  14. sudo systemctl restart docker

2、安装k8s基础环境设置

所有机器执行如下操作

各个机器设置自己的域名

  1. hostnamectl set-hostname xxxx

我这里就设置为

  1. hostnamectl set-hostname k8s-new-master
  2. hostnamectl set-hostname k8s-new-node1
  3. hostnamectl set-hostname k8s-new-node2

将 SELinux 设置为 permissive 模式(相当于将其禁用)

  1. sudo setenforce 0
  2. sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

关闭swap

  1. swapoff -a
  2. sed -ri 's/.*swap.*/#&/' /etc/fstab

关闭防火墙

  1. systemctl stop firewalld

允许 iptables 检查桥接流量

  1. cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
  2. br_netfilter
  3. EOF
  4. cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
  5. net.bridge.bridge-nf-call-ip6tables = 1
  6. net.bridge.bridge-nf-call-iptables = 1
  7. EOF

让上面的配置生效

  1. sudo sysctl --system

3、安装kubelet、kubeadm、kubectl

  1. cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  5. enabled=1
  6. gpgcheck=0
  7. repo_gpgcheck=0
  8. gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
  9. http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  10. exclude=kubelet kubeadm kubectl
  11. EOF
  1. sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes
  1. sudo systemctl enable --now kubelet

4、使用kubeadm引导集群

4-1、下载各个机器需要的镜像
  1. sudo tee ./images.sh <<-'EOF'
  2. #!/bin/bash
  3. images=(
  4. kube-apiserver:v1.20.9
  5. kube-proxy:v1.20.9
  6. kube-controller-manager:v1.20.9
  7. kube-scheduler:v1.20.9
  8. coredns:1.7.0
  9. etcd:3.4.13-0
  10. pause:3.2
  11. )
  12. for imageName in ${images[@]} ; do
  13. docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
  14. done
  15. EOF
  1. chmod +x ./images.sh && ./images.sh
4-2、初始化主节点

所有机器添加master域名映射,以下需要修改为自己的

  1. echo "192.168.192.8 k8s-new-master" >> /etc/hosts

下面的操作都在主节点即可

主节点初始化,只需要在主节点也就是master做即可

正常service-cidr和pod-network-cidr不建议修改,应为后面一些网络配置用的就是它,如果修改了要做相应的调整

但是我这里pod-network-cidr因为这个跟本机冲突了,所以导致ping不通pod,所以我这里改了一下,后面安装网络插件calico.yaml的时候也需要对应的修改下,pod-network-cidr的默认值为192.168.0.0/16,我改为10.244.0.0/16。(参考:https://blog.csdn.net/weixin_43757027/article/details/123577417)

  1. kubeadm init \
  2. --apiserver-advertise-address=192.168.192.8 \
  3. --control-plane-endpoint=k8s-new-master \
  4. --image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
  5. --kubernetes-version v1.20.9 \
  6. --service-cidr=10.96.0.0/16 \
  7. --pod-network-cidr=10.244.0.0/16

要保证所有网络范围不重叠,执行完后会有一段日志,一定要拷贝下来,后面加入节点有用

  1. Your Kubernetes control-plane has initialized successfully!
  2. To start using your cluster, you need to run the following as a regular user:
  3. mkdir -p $HOME/.kube
  4. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  5. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  6. Alternatively, if you are the root user, you can run:
  7. export KUBECONFIG=/etc/kubernetes/admin.conf
  8. You should now deploy a pod network to the cluster.
  9. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  10. https://kubernetes.io/docs/concepts/cluster-administration/addons/
  11. You can now join any number of control-plane nodes by copying certificate authorities
  12. and service account keys on each node and then running the following as root:
  13. kubeadm join k8s-new-master:6443 --token wyd5si.xujsxwbpndj7b9n1 \
  14. --discovery-token-ca-cert-hash sha256:071c85ba8f7b184394bd3e44e54243152bbb658f1053c0a90b590631b6370cb2 \
  15. --control-plane
  16. Then you can join any number of worker nodes by running the following on each as root:
  17. kubeadm join k8s-new-master:6443 --token wyd5si.xujsxwbpndj7b9n1 \
  18. --discovery-token-ca-cert-hash sha256:071c85ba8f7b184394bd3e44e54243152bbb658f1053c0a90b590631b6370cb2

根据上面的日志提示继续执行

4-3、设置.kube/config
  1. mkdir -p $HOME/.kube
  2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. sudo chown $(id -u):$(id -g) $HOME/.kube/config
4-4、安装网络组件

若没有wget命令,可以先安装

  1. yum install -y wget
  1. wget https://docs.projectcalico.org/manifests/calico.yaml

然后发现网络不通,下载报错,则用这个https://www.suibibk.com//fileupload/files/calico.yaml

这里一定要修改下面逻辑

  1. # - name: CALICO_IPV4POOL_CIDR
  2. # value: "192.168.0.0/16"
  3. - name: CALICO_IPV4POOL_CIDR
  4. value: "10.244.0.0/16"

ip一定要改为跟之前初始化指定的一样。

  1. kubectl apply -f calico.yaml
4-5、加入node节点,也是用上面的日志,这里要在字节点执行
  1. kubeadm join k8s-new-master:6443 --token wyd5si.xujsxwbpndj7b9n1 \
  2. --discovery-token-ca-cert-hash sha256:071c85ba8f7b184394bd3e44e54243152bbb658f1053c0a90b590631b6370cb2

如果令牌不记得了,可以执行如下命令产生新令牌

  1. kubeadm token create --print-join-command

提示如下错误

  1. [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 20.10.7. Latest validated version: 19.03

这里要降低docker的版本(当然不降低也可以,毕竟只是警告)

如果卡住,那么需要关闭防火墙,前面的流程应该已经关闭

  1. systemctl stop firewalld

当然最好先永久关闭,不然开机后可能有问题

  1. systemctl disable firewalld #永久关闭,即设置开机的时候不自动启动

加入后过几分钟,在master节点就会看到

  1. [root@k8s-new-master ~]# kubectl get nodes
  2. NAME STATUS ROLES AGE VERSION
  3. k8s-new-master Ready control-plane,master 31m v1.20.9
  4. k8s-new-node1 Ready <none> 3m22s v1.20.9
  5. k8s-new-node2 Ready <none> 3m4s v1.20.9
4-6、如果是加入高可用的主节点,也是按日志的步骤执行下面命令即可
  1. kubeadm join k8s-new-master:6443 --token wyd5si.xujsxwbpndj7b9n1 \
  2. --discovery-token-ca-cert-hash sha256:071c85ba8f7b184394bd3e44e54243152bbb658f1053c0a90b590631b6370cb2 \
  3. --control-plane
4-7、相关命令
  1. #查看集群所有节点
  2. kubectl get nodes
  3. #根据配置文件,给集群创建资源
  4. kubectl apply -f xxxx.yaml
  5. #查看集群部署了哪些应用?
  6. docker ps === kubectl get pods -A
  7. # 运行中的应用在docker里面叫容器,在k8s里面叫Pod
  8. kubectl get pods -A

5、部署dashboard

kubernetes官方提供的可视化界面
https://github.com/kubernetes/dashboard

执行如下命令就可

  1. kubectl apply -f https://www.suibibk.com//fileupload/files/dashboard.yaml

可以下载下来再执行,里面的主节点是k8s-master,记得全部要改为自己的,我现在是k8s-new-master

查看状态

  1. kubectl get pods -A

都running了后再继续执行

如果出错了,可以重启

  1. kubectl replace --force -f dashboard.yaml
5-1、设置访问端口
  1. kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

type: ClusterIP 改为 type: NodePort

5-2、找到端口
  1. kubectl get svc -A |grep kubernetes-dashboard
  1. 443:30110

云服务器需要安全组放行,防火墙放行

访问:

  1. https://集群任意IP:端口

我这里是:https://192.168.192.8:30110

5-3、故障

完全访问不了,查看日志

  1. #查看容器
  2. kubectl get pods -A
  3. #查看日志
  4. kubectl logs kubernetes-dashboard-775688487c-fpzv8 -n kubernetes-dashboard

发现错误

  1. Initializing csrf token from kubernetes-dashboard-csrf secret panic: Get https://10.96.0.1:443/api/v1/namespaces/kubernetes-dashboard/secrets/kubernetes-dashboard-csrf: dial tcp 10.96.0.1:443: i/o timeout

跟我遇到的一样的原因

https://blog.csdn.net/qq_44847649/article/details/123504663
https://blog.csdn.net/qq_44847649/article/details/123082308

参考解决下,解决完后,要用这个强制重新部署

  1. kubectl replace --force -f dashboard.yaml

再查看状态就很正常了

  1. kubectl get pods -A

重走5-1,5-2

访问,大公告成:https://192.168.192.8:30110

如果用我上面的yaml,则只需修改主节点的名字即可,不需要做其他操作,也不会遇到上面的问题

5-4、创建访问账号
  1. #创建访问账号,准备一个yaml文件; vi dash.yaml
  2. apiVersion: v1
  3. kind: ServiceAccount
  4. metadata:
  5. name: admin-user
  6. namespace: kubernetes-dashboard
  7. ---
  8. apiVersion: rbac.authorization.k8s.io/v1
  9. kind: ClusterRoleBinding
  10. metadata:
  11. name: admin-user
  12. roleRef:
  13. apiGroup: rbac.authorization.k8s.io
  14. kind: ClusterRole
  15. name: cluster-admin
  16. subjects:
  17. - kind: ServiceAccount
  18. name: admin-user
  19. namespace: kubernetes-dashboard
  1. kubectl apply -f dash.yaml
5-5、获取访问令牌
  1. #获取访问令牌
  2. kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"

下面的是我的登录token,每个人都要用自己的

  1. eyJhbGciOiJSUzI1NiIsImtpZCI6IkVRZGZRRm52ZlJwcWRlc040dURELTluQ1daZjV2M3o2dnBzaEhReDBZbTAifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXRqbXJwIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJmN2M3OGJkZi0xN2YzLTQxY2UtYmVhNS1lYzA0MDY4ZDgxYTQiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.tUEW6nt4KvoV48eoAShBFqGUQx4e5KHb8nB8X24JhNf9vGhAfgAKgLo1S4HEgmqPkM1FUsMxxeNZMvRvjOI7Ju9AVUQkG7bz3skd1I_yZSoiOlcc6_woCXZ0az_nOGwvjjYeE8s8TuBT0nGkiKyZBiruyjyluHJyvv_wYex4DsyGUTKytX7ab0ndSz67JdVvzsfKjOrHmvSc_93D_mWvPwuboma-22qtdH5B-OZ3LOtj-15jRdSd3B4fTsZkw8Sijjgda5ltfncYvg-MJbAq0BEOhYYzmLL5p6CfD5Nq9rnDC1NcrMQfkUu3FblekDfWasHqRvM7iEBr_G0dvuh_Pg
5-6、这里建议永久关闭下firewall

因为上面就是因为防火墙没关闭加入节点报错

  1. systemctl disable firewalld #永久关闭,即设置开机的时候不自动启动
5-7、重启试试,重启完后执行命令
  1. #重启
  2. reboot
  3. #查看节点
  4. kubectl get nodes
  5. #查看pod
  6. kubectl get pods -A

访问控制台https://192.168.192.8:30110

发现都正常,至此,k8s集群搭建成功

喵的,电脑才16G内存,搭建这个集群果然有点费力

5-8、简单测试

新建一个nginx的yaml:nginx-pod.yaml

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. labels:
  5. run: mynginx
  6. name: mynginx
  7. # namespace: default
  8. spec:
  9. containers:
  10. - image: nginx
  11. name: mynginx
  1. kubectl apply -f nginx-pod.yaml

查看pod的ip

  1. kubectl get pods -owide
  1. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  2. mynginx 1/1 Running 0 2m2s 10.244.53.1 k8s-new-node2 <none> <none>

可以看到是在节点2,我们在master访问下

  1. curl 10.244.53.1:80

发现成功啦,第二次安装由于指定了pod-network-cidr,终于没有出现问题,开心,得打个快照才行,防止后面搞kubesphere搞坏。

教程参考:

1、视频教程
https://www.bilibili.com/video/BV13Q4y1C7hS
2、笔记
https://www.yuque.com/leifengyang/oncloud/

 427

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2