ToB企服应用市场:ToB评测及商务社交产业平台

标题: centos 7 摆设k8s集群 1.28.2版本 [打印本页]

作者: 种地    时间: 2024-6-14 22:35
标题: centos 7 摆设k8s集群 1.28.2版本
1. 准备工作(所有节点执行)

1.1. 准备虚拟机

当地摆设,仅供参考。

三个节点:名字为k8s-node1、k8s-node2、k8s-master
设置体系主机名及Host 文件
  1. sudo cat << EOF >> /etc/hosts
  2. 192.168.255.141 k8s-node1
  3. 192.168.255.142 k8s-node2
  4. 192.168.255.140 k8s-master
  5. EOF
复制代码
  1. # 对应的节点执行
  2. sudo hostnamectl set-hostname k8s-node1
  3. sudo hostnamectl set-hostname k8s-node2
  4. sudo hostnamectl set-hostname k8s-master
复制代码
1.2 更新yum

  1. # 需要更新很久
  2.         sudo yum update -y
  3. #设置存储库
  4.     sudo yum install -y yum-utils
  5.     sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
复制代码
1.3 相干设置

1.3.1 禁用iptablesfirewalld服务

  1. systemctl stop firewalld
  2. systemctl disable firewalld
  3. systemctl stop iptables
  4. systemctl disable iptables
复制代码
1.3.2 禁用selinux

  1. # 永久关闭
  2.         sed -i 's/enforcing/disabled/' /etc/selinux/config
  3. # 临时关闭
  4.         setenforce 0
复制代码
1.3.3 禁用swap分区

  1. # 临时关闭
  2.         swapoff -a
  3. # 永久关闭
  4. vim /etc/fstab
  5.         将行
  6.         /dev/mapper/xxx    swap   xxx
  7.         注释
复制代码

1.3.4 调解内核参数,对于 K8S

  1. cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
  2. net.bridge.bridge-nf-call-iptables  = 1
  3. net.bridge.bridge-nf-call-ip6tables = 1
  4. net.ipv4.ip_forward                 = 1
  5. EOF
  6. # 依次执行下面命令
  7. sysctl -p
  8. modprobe br_netfilter
  9. lsmod | grep br_netfilter
复制代码
显示:

1.3.5 设置 ipvs 功能

  1. # 安装ipset和ipvsadm
  2.         yum install ipset ipvsadmin -y
  3. # 添加需要加载的模块写入脚本文件
  4. cat <<EOF > /etc/sysconfig/modules/ipvs.modules
  5. #!/bin/bash
  6. modprobe -- ip_vs
  7. modprobe -- ip_vs_rr
  8. modprobe -- ip_vs_wrr
  9. modprobe -- ip_vs_sh
  10. modprobe -- nf_conntrack_ipv4
  11. EOF
  12. # 为脚本文件添加执行权限
  13.         chmod +x /etc/sysconfig/modules/ipvs.modules
  14. # 执行脚本文件
  15.          /bin/bash /etc/sysconfig/modules/ipvs.modules
  16. # 查看对应的模块是否加载成功
  17.         lsmod | grep -e ip_vs -e nf_conntrack_ipv4
复制代码
显示:

重启

  1. reboot
复制代码
2. 安装docker和cri-dockerd(所有节点执行)

2.1 安装docker

2.1.1 移除旧版docker(新安装虚拟机则不需执行)

  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
复制代码
2.1.2 安装docker及其依靠库

  1. sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
复制代码
2.1.3 启动Docker,设置开机自启动

  1. # 启动docker
  2. sudo systemctl start docker
  3. # 设置docker开机启动
  4. sudo systemctl enable docker
  5. # 验证
  6. sudo systemctl status docker
复制代码

2.2 安装cri-dockerd

k8s 1.24版本后需要使用cri-dockerd和docker通信
2.2.1 下载cri-dockerd

  1. # 若没有wget,则执行
  2.         sudo yum install -y wget
  3. # 下载
  4.         sudo wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.el7.x86_64.rpm
  5. # 安装
  6.         sudo rpm -ivh cri-dockerd-0.3.4-3.el7.x86_64.rpm
  7. # 重载系统守护进程
  8.         sudo systemctl daemon-reload
复制代码
2.2.2 设置镜像加速

  1. sudo tee /etc/docker/daemon.json <<-'EOF'
  2. {
  3.   "registry-mirrors": ["https://c12xt3od.mirror.aliyuncs.com"]
  4. }
  5. EOF
复制代码
2.2.3 修改设置文件

  1. 修改第10行 ExecStart=
  2. 改为        ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
  3. vi /usr/lib/systemd/system/cri-docker.service
复制代码
2.2.4 自启动、重启Docker组件

  1. # 重载系统守护进程
  2.         sudo systemctl daemon-reload
  3. # 设置cri-dockerd自启动
  4.         sudo systemctl enable cri-docker.socket cri-docker
  5. # 启动cri-dockerd
  6.         sudo systemctl start cri-docker.socket cri-docker
  7. # 检查Docker组件状态
  8.         sudo systemctl status docker cir-docker.socket cri-docker
复制代码
显示:

3. 安装Kubernetes

3.1 安装kubectl(所有节点执行)

  1. #  当前使用的是最新版本 v1.28.2
  2. # 下载
  3.         curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
  4. # 检验
  5.         curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
  6.         echo "$(cat kubectl.sha256)  kubectl" | sha256sum --check
  7. # 安装
  8.         sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
  9. # 测试
  10.         kubectl version --client
复制代码
3.2 安装kubeadm(所有节点执行)

  1. # 改国内源
  2. cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
  3. [kubernetes]
  4. name=Kubernetes
  5. baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  6. enabled=1
  7. gpgcheck=0
  8. repo_gpgcheck=1
  9. gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
  10.         http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  11. exclude=kubelet kubeadm kubectl
  12. EOF  
  13. # 安装
  14.         sudo yum install -y install kubeadm-1.28.2-0 kubelet-1.28.2-0 kubectl-1.28.2-0 --disableexcludes=kubernetes
  15. # 设置自启动
  16.         sudo systemctl enable --now kubelet
复制代码
3.3 安装runc(所有节点执行)

  1. # 下载 runc.amd64  
  2.         sudo wget https://github.com/opencontainers/runc/releases/download/v1.1.9/runc.amd64
  3. # 安装
  4.         sudo install -m 755 runc.amd64 /usr/local/bin/runc
  5. # 验证
  6.         runc -v
复制代码
3.4 摆设集群

3.4.1 初始化集群(master节点执行)

  1. # 执行 kubeadm  init 命令
  2. kubeadm init  --node-name=k8s-master --image-repository=registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock --apiserver-advertise-address=192.168.255.140 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
  3. # 需要修改的参数
  4.         --apiserver-advertise-address # 指定 API 服务器的广告地址、我设置为master节点的ip
  5.        
  6. # 初始化成功后运行下面的命令       
  7.     mkdir -p $HOME/.kube
  8.     sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  9.     sudo chown $(id -u):$(id -g) $HOME/.kube/config
  10. # master节点执行 配置文件的复制(为了在node节点可以使用kubectl相关命令)
  11.         scp /etc/kubernetes/admin.conf 192.168.255.141:/etc/kubernetes/
  12.         scp /etc/kubernetes/admin.conf 192.168.255.142:/etc/kubernetes/
复制代码
显示:

3.4.2 node节点加入(node节点执行)

  1. # 到node节点检查admin.conf文件是否传输完成
  2.         ls /etc/kubernetes/
  3.         admin.conf  manifests
  4. # 将admin.conf加入环境变量,直接使用永久生效
  5.         echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >>  ~/.bash_profile
  6. # 加载
  7.         source ~/.bash_profile
  8.        
  9. # ---------------------------------加入集群-------------------------------------
  10. # 1.在master节点执行 kubeadm init成功后,会出现 kubeadm join xxx xxx的命令,直接复制到node节点执行就好。
  11. # 2.下面是若没有复制到kubeadm join的命令或者是想要在集群中加入新节点,
  12. #   则先在master执行,获取token 和 discovery-token-ca-cert-hash。
  13. #   获取 token 参数
  14.                 kubeadm token list   # 查看已有 token
  15.                 kubeadm token create # 没有token则执行,创建新的 TOKEN
  16. #   获取 discovery-token-ca-cert-hash 参数
  17.                 openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null |  openssl dgst -sha256 -hex | sed 's/^.* //'
  18. # 3.node节点执行 kubeadm join
  19. # 修改获取的 token 和 discovery-token-ca-cert-hash 后,再执行
  20.     kubeadm join 192.168.255.140:6443 --token y8v2nc.ie2ovh1kxqtgppbo --discovery-token-ca-cert-hash sha256:1fa593d1bc58653afaafc9ca492bde5b8e40e9adef055e8e939d4eb34fb436bf --cri-socket unix:///var/run/cri-dockerd.sock
复制代码

3.4.3 重新加入集群(node节点执行)

  1. # 先执行
  2.         kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock
  3. # 再获取TOKEN、discovery-token-ca-cert-hash 参数后,最后执行
  4.         kubeadm join 192.168.255.140:6443 --token y8v2nc.ie2ovh1kxqtgppbo --discovery-token-ca-cert-hash sha256:1fa593d1bc58653afaafc9ca492bde5b8e40e9adef055e8e939d4eb34fb436bf --cri-socket unix:///var/run/cri-dockerd.sock
复制代码
3.4.4 安装网络插件下载然后运行

  1. # 下载,若网络抽风~~,则复制下面的kube-flannel.yml
  2.         sudo wget https://github.com/flannel-io/flannel/releases/download/v0.22.3/kube-flannel.yml
  3. # 执行
  4.         kubectl apply -f kube-flannel.yml
复制代码
或者
  1. vi kube-flannel.yml
复制代码
  1. # kube-flannel.yml
  2. apiVersion: v1
  3. kind: Namespace
  4. metadata:
  5.   labels:
  6.     k8s-app: flannel
  7.     pod-security.kubernetes.io/enforce: privileged
  8.   name: kube-flannel
  9. ---
  10. apiVersion: v1
  11. kind: ServiceAccount
  12. metadata:
  13.   labels:
  14.     k8s-app: flannel
  15.   name: flannel
  16.   namespace: kube-flannel
  17. ---
  18. apiVersion: rbac.authorization.k8s.io/v1
  19. kind: ClusterRole
  20. metadata:
  21.   labels:
  22.     k8s-app: flannel
  23.   name: flannel
  24. rules:
  25. - apiGroups:
  26.   - ""
  27.   resources:
  28.   - pods
  29.   verbs:
  30.   - get
  31. - apiGroups:
  32.   - ""
  33.   resources:
  34.   - nodes
  35.   verbs:
  36.   - get
  37.   - list
  38.   - watch
  39. - apiGroups:
  40.   - ""
  41.   resources:
  42.   - nodes/status
  43.   verbs:
  44.   - patch
  45. - apiGroups:
  46.   - networking.k8s.io
  47.   resources:
  48.   - clustercidrs
  49.   verbs:
  50.   - list
  51.   - watch
  52. ---
  53. apiVersion: rbac.authorization.k8s.io/v1
  54. kind: ClusterRoleBinding
  55. metadata:
  56.   labels:
  57.     k8s-app: flannel
  58.   name: flannel
  59. roleRef:
  60.   apiGroup: rbac.authorization.k8s.io
  61.   kind: ClusterRole
  62.   name: flannel
  63. subjects:
  64. - kind: ServiceAccount
  65.   name: flannel
  66.   namespace: kube-flannel
  67. ---
  68. apiVersion: v1
  69. data:
  70.   cni-conf.json: |
  71.     {
  72.       "name": "cbr0",
  73.       "cniVersion": "0.3.1",
  74.       "plugins": [
  75.         {
  76.           "type": "flannel",
  77.           "delegate": {
  78.             "hairpinMode": true,
  79.             "isDefaultGateway": true
  80.           }
  81.         },
  82.         {
  83.           "type": "portmap",
  84.           "capabilities": {
  85.             "portMappings": true
  86.           }
  87.         }
  88.       ]
  89.     }
  90.   net-conf.json: |
  91.     {
  92.       "Network": "10.244.0.0/16",
  93.       "Backend": {
  94.         "Type": "vxlan"
  95.       }
  96.     }
  97. kind: ConfigMap
  98. metadata:
  99.   labels:
  100.     app: flannel
  101.     k8s-app: flannel
  102.     tier: node
  103.   name: kube-flannel-cfg
  104.   namespace: kube-flannel
  105. ---
  106. apiVersion: apps/v1
  107. kind: DaemonSet
  108. metadata:
  109.   labels:
  110.     app: flannel
  111.     k8s-app: flannel
  112.     tier: node
  113.   name: kube-flannel-ds
  114.   namespace: kube-flannel
  115. spec:
  116.   selector:
  117.     matchLabels:
  118.       app: flannel
  119.       k8s-app: flannel
  120.   template:
  121.     metadata:
  122.       labels:
  123.         app: flannel
  124.         k8s-app: flannel
  125.         tier: node
  126.     spec:
  127.       affinity:
  128.         nodeAffinity:
  129.           requiredDuringSchedulingIgnoredDuringExecution:
  130.             nodeSelectorTerms:
  131.             - matchExpressions:
  132.               - key: kubernetes.io/os
  133.                 operator: In
  134.                 values:
  135.                 - linux
  136.       containers:
  137.       - args:
  138.         - --ip-masq
  139.         - --kube-subnet-mgr
  140.         command:
  141.         - /opt/bin/flanneld
  142.         env:
  143.         - name: POD_NAME
  144.           valueFrom:
  145.             fieldRef:
  146.               fieldPath: metadata.name
  147.         - name: POD_NAMESPACE
  148.           valueFrom:
  149.             fieldRef:
  150.               fieldPath: metadata.namespace
  151.         - name: EVENT_QUEUE_DEPTH
  152.           value: "5000"
  153.         image: docker.io/flannel/flannel:v0.22.3
  154.         name: kube-flannel
  155.         resources:
  156.           requests:
  157.             cpu: 100m
  158.             memory: 50Mi
  159.         securityContext:
  160.           capabilities:
  161.             add:
  162.             - NET_ADMIN
  163.             - NET_RAW
  164.           privileged: false
  165.         volumeMounts:
  166.         - mountPath: /run/flannel
  167.           name: run
  168.         - mountPath: /etc/kube-flannel/
  169.           name: flannel-cfg
  170.         - mountPath: /run/xtables.lock
  171.           name: xtables-lock
  172.       hostNetwork: true
  173.       initContainers:
  174.       - args:
  175.         - -f
  176.         - /flannel
  177.         - /opt/cni/bin/flannel
  178.         command:
  179.         - cp
  180.         image: docker.io/flannel/flannel-cni-plugin:v1.2.0
  181.         name: install-cni-plugin
  182.         volumeMounts:
  183.         - mountPath: /opt/cni/bin
  184.           name: cni-plugin
  185.       - args:
  186.         - -f
  187.         - /etc/kube-flannel/cni-conf.json
  188.         - /etc/cni/net.d/10-flannel.conflist
  189.         command:
  190.         - cp
  191.         image: docker.io/flannel/flannel:v0.22.3
  192.         name: install-cni
  193.         volumeMounts:
  194.         - mountPath: /etc/cni/net.d
  195.           name: cni
  196.         - mountPath: /etc/kube-flannel/
  197.           name: flannel-cfg
  198.       priorityClassName: system-node-critical
  199.       serviceAccountName: flannel
  200.       tolerations:
  201.       - effect: NoSchedule
  202.         operator: Exists
  203.       volumes:
  204.       - hostPath:
  205.           path: /run/flannel
  206.         name: run
  207.       - hostPath:
  208.           path: /opt/cni/bin
  209.         name: cni-plugin
  210.       - hostPath:
  211.           path: /etc/cni/net.d
  212.         name: cni
  213.       - configMap:
  214.           name: kube-flannel-cfg
  215.         name: flannel-cfg
  216.       - hostPath:
  217.           path: /run/xtables.lock
  218.           type: FileOrCreate
  219.         name: xtables-lock
复制代码
3.5 测试kubernetes 集群

  1. # 下面一般在master节点执行,若node节点可以使用kubectl命令,也可以在node节点上操作
  2. kubectl get nodes
  3. kubectl get pod -A               
复制代码
显示:


3.5.1 使用nginx测试

  1. vi nginx-deployment.yaml
  2. kubectl apply -f nginx-deployment.yaml
复制代码
  1. # nginx-deployment.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   name: nginx-deployment
  6. spec:
  7.   replicas: 3
  8.   selector:
  9.     matchLabels:
  10.       app: nginx
  11.   template:
  12.     metadata:
  13.       labels:
  14.         app: nginx
  15.     spec:
  16.       containers:
  17.         - name: nginx
  18.           image: nginx:latest
  19.           ports:
  20.             - containerPort: 80
  21. ---
  22. apiVersion: v1
  23. kind: Service
  24. metadata:
  25.   name: nginx-service
  26. spec:
  27.   selector:
  28.     app: nginx
  29.   ports:
  30.     - name: http
  31.       port: 80
  32.       targetPort: 80
  33.       nodePort: 30080
  34.   type: NodePort
复制代码
执行
  1. [root@k8s-master k8s]# kubectl get pod,svc |grep nginx
  2. pod/nginx-deployment-7c79c4bf97-4xzc9   1/1     Running   0          83s
  3. pod/nginx-deployment-7c79c4bf97-lp4fn   1/1     Running   0          83s
  4. pod/nginx-deployment-7c79c4bf97-vt8wh   1/1     Running   0          83s
  5. service/nginx-service   NodePort    10.97.154.241   <none>        80:30080/TCP   83s
复制代码
访问:http://192.168.255.140:30080/,出现这个页面就算大功告成!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4