Kubernetes(K8S)集群摆设

[复制链接]
发表于 2026-2-25 13:42:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目次
一、创建3台假造机
二、为每台假造机安装Docker
三、安装kubelet
3.1 安装要求
3.2 为每台服务器完成前置设置
3.3 为每台服务器安装kubelet、kubeadm、kubectl
四、利用kubeadm引导集群
4.1 master服务器
4.2 node1、node2服务器
4.3 初始化主节点
4.4 work节点加入集群
五、token逾期怎么办?
六、安装可视化界面dashboard
6.1 安装
6.2 袒露端口
6.3 访问web界面
6.4 创建访问账号
6.5 天生令牌
6.6 登录
七、写在背面的话


一、创建3台假造机

具体操纵步调可以参考之前的教程,发起是先安装一台,然后克隆假造机,如许速率快。
注意:在克隆时记得修改Mac地点、IP地点、UUID和主机名。(末了别忘了生存下快照~)
安装VMware假造机、Linux体系(CentOS7)_何苏三月的博客-CSDN博客
克隆Linux体系(centos)_linux克隆_何苏三月的博客-CSDN博客
 
二、为每台假造机安装Docker

请参考:Docker安装、常见下令、安装常见容器(Mysql、Redis等)_docker redis 容器_何苏三月的博客-CSDN博客
教程中安装docker的下令
  1. yum install docker-ce docker-ce-cli containerd.io
复制代码
原来是默认安装最新版,这里须要指定一下版本,目的是保障后续安装k8s不出题目:
  1. yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7  containerd.io-1.4.6
复制代码
其他步调稳定。
三、安装kubelet

3.1 安装要求



  • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。
  • 每台呆板 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
  • 2 CPU 核或更多
  • 集群中的全部呆板的网络相互均能相互毗连(公网和内网都可以)

  • 节点之中不可以有重复的主机名、MAC 地点或 product_uuid。请拜见这里相识更多具体信息。

    • 设置差异hostname

  • 开启呆板上的某些端口。请拜见这里 相识更多具体信息。

    • ​​​​​​​内网互信

  • 禁用交换分区。为了包管 kubelet 正常工作,你 必须 禁用交换分区。

    • ​​​​​​​永世关闭

3.2 为每台服务器完成前置设置

  1. #各个机器设置自己的域名
  2. hostnamectl set-hostname xxxx
  3. # 将 SELinux 设置为 permissive 模式(相当于将其禁用)
  4. sudo setenforce 0
  5. sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
  6. #关闭swap
  7. swapoff -a  
  8. sed -ri 's/.*swap.*/#&/' /etc/fstab
  9. #允许 iptables 检查桥接流量
  10. cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
  11. br_netfilter
  12. EOF
  13. cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
  14. net.bridge.bridge-nf-call-ip6tables = 1
  15. net.bridge.bridge-nf-call-iptables = 1
  16. EOF
  17. sudo sysctl --system
复制代码




3.3 为每台服务器安装kubelet、kubeadm、kubectl

kubelet - “厂长”
kubectl - 步伐员敲下令行的下令窗
kubeadm - 引导创建集群的
  1. # 1.先配置K8S去哪儿下载的地址信息
  2. cat <<EOF > /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=0
  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. # 2. 安装
  14. sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes
  15. # 3. 启动kubelet
  16. sudo systemctl enable --now kubelet
复制代码
💡systemctl status kubelet 检察状态会发现,kubelet 现在每隔几秒就会重启,由于它陷入了一个等待 kubeadm 指令的死循环。这是正常征象不消管!



四、利用kubeadm引导集群


4.1 master服务器

下载各个呆板须要的镜像,以下只须要在master呆板上实行:
  1. # 1. 定义一个for循环,需要的东西下载
  2. sudo tee ./images.sh <<-'EOF'
  3. #!/bin/bash
  4. images=(
  5. kube-apiserver:v1.20.9
  6. kube-proxy:v1.20.9
  7. kube-controller-manager:v1.20.9
  8. kube-scheduler:v1.20.9
  9. coredns:1.7.0
  10. etcd:3.4.13-0
  11. pause:3.2
  12. )
  13. for imageName in ${images[@]} ; do
  14. docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
  15. done
  16. EOF
  17. # 2. 赋予权限,让它下载这些东西
  18. chmod +x ./images.sh && ./images.sh
复制代码



4.2 node1、node2服务器

从图上可以知道,从节点也须要安装kube-proxy。我们可以只下载这个镜像,固然了为了制止出现不测,我们也可以都下载下来。
方法完全参考4.1
4.3 初始化主节点

   1.起首给全部的服务器都添加一下k8s110这台服务器的域名映射
  1. #所有机器添加master域名映射,以下需要修改为自己的内网ip地址
  2. echo "192.168.37.110  cluster-endpoint" >> /etc/hosts
复制代码

   2.然后只在k8s110这台服务器上实行主节点初始化过程:
  1. #主节点初始化
  2. kubeadm init \
  3. --apiserver-advertise-address=192.168.37.110 \
  4. --control-plane-endpoint=cluster-endpoint \
  5. --image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
  6. --kubernetes-version v1.20.9 \
  7. --service-cidr=10.96.0.0/16 \
  8. --pod-network-cidr=192.168.50.0/24
  9. #要求所有网络范围不重叠 --pod-network-cidr  --service-cidr --apiserver-advertise-address 都不能重叠
复制代码

如果出现上述错误,则实行如下下令:
  1. sysctl -w net.ipv4.ip_forward=1
复制代码

然后重新实行

末了看到如下画面则表现初始化乐成!

这段还比力告急的,它告诉我们怎么利用这个集群信息等等,以是我们把文本单独复制出来
  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 cluster-endpoint:6443 --token 3e54se.alzs9d1mkf30f25w \
  14.     --discovery-token-ca-cert-hash sha256:689c076e294bdbb588103a51aaa7248b8a0df34bde634a6189d311ad46a02856 \
  15.     --control-plane
  16. Then you can join any number of worker nodes by running the following on each as root:
  17. kubeadm join cluster-endpoint:6443 --token 3e54se.alzs9d1mkf30f25w \
  18.     --discovery-token-ca-cert-hash sha256:689c076e294bdbb588103a51aaa7248b8a0df34bde634a6189d311ad46a02856
复制代码
那么按照它的要求一步一步实行吧!
   3.按要求创建文件夹复制文件给予权限等操纵
  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
复制代码

然后我们检察一下集群的全部结点:
  1. #查看集群所有节点
  2. kubectl get nodes
复制代码

发现k8s110这台服务器就是master节点了,但是它的状态是NotReady。
没关系按照它的要求继承实行,下一步说须要安装一个网络插件。
   4.安装网络插件
  可以有多种安装选择,我们就用calico
  1. curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
复制代码

下载乐成,我们calico.yaml设置文件就有了。
告急提示💡:如果我们在初始化主节点时,修改了--pod-network-cidr=192.168.0.0/16,那么我们就要进入这个设置文件,将我们修改后的ip地点写上去。

ok,有了这个设置文件,就可以通过如下下令为k8s安装calico插件所须要的东西了
  1. #根据配置文件,给集群创建资源(以后通过该命令为k8s创建资源,不限于calico)
  2. kubectl apply -f calico.yaml
复制代码
 然后实行下令安装calico网络插件

如果出现上述提示,阐明我们的yaml文件有大概换行符搞错了等等。

再重新下载就好了。

我们怎样检察集群摆设了哪些应用呢?
  1. # 查看集群部署了哪些应用
  2. docker ps
  3. # 等价于
  4. kubectl get pods -A
  5. # 运行中的应用在docker里面叫容器,在k8s里面叫Pod,至于为什么,后续再讲
复制代码


以上,master节点就准备停当了!
4.4 work节点加入集群

前面初始化主节点乐成后的提示中有步调:
  1. kubeadm join cluster-endpoint:6443 --token 3e54se.alzs9d1mkf30f25w \
  2.     --discovery-token-ca-cert-hash sha256:689c076e294bdbb588103a51aaa7248b8a0df34bde634a6189d311ad46a02856
复制代码
我们只须要将它在别的两台服务器各自实行即可。
如果加入报错,请检察是否已经关闭了防火墙,确保关闭防火墙然后实行:
  1. sysctl -w net.ipv4.ip_forward=1
复制代码

ok,然后去master检察一下节点信息。


我们也可以通过linux的下令 watch -n 1 kubectl get pods -A,每一秒检察一下状态


OK了,我们再看看

至此,K8S集群就跑起来了。


五、token逾期怎么办?

token凌驾24小时就失效了,如果我们还没有加入从节点,大概想加入新的从节点,可以在master节点实行如下下令,让它重新天生
  1. kubeadm token create --print-join-command
复制代码
六、安装可视化界面dashboard

6.1 安装

  1. kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
复制代码

如果网络不好安装不了就复制下面的,将它写入到一个yaml文件中,然后实行该文件即可:
  1. # Copyright 2017 The Kubernetes Authors.
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. #     http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. apiVersion: v1
  15. kind: Namespace
  16. metadata:
  17.   name: kubernetes-dashboard
  18. ---
  19. apiVersion: v1
  20. kind: ServiceAccount
  21. metadata:
  22.   labels:
  23.     k8s-app: kubernetes-dashboard
  24.   name: kubernetes-dashboard
  25.   namespace: kubernetes-dashboard
  26. ---
  27. kind: Service
  28. apiVersion: v1
  29. metadata:
  30.   labels:
  31.     k8s-app: kubernetes-dashboard
  32.   name: kubernetes-dashboard
  33.   namespace: kubernetes-dashboard
  34. spec:
  35.   ports:
  36.     - port: 443
  37.       targetPort: 8443
  38.   selector:
  39.     k8s-app: kubernetes-dashboard
  40. ---
  41. apiVersion: v1
  42. kind: Secret
  43. metadata:
  44.   labels:
  45.     k8s-app: kubernetes-dashboard
  46.   name: kubernetes-dashboard-certs
  47.   namespace: kubernetes-dashboard
  48. type: Opaque
  49. ---
  50. apiVersion: v1
  51. kind: Secret
  52. metadata:
  53.   labels:
  54.     k8s-app: kubernetes-dashboard
  55.   name: kubernetes-dashboard-csrf
  56.   namespace: kubernetes-dashboard
  57. type: Opaque
  58. data:
  59.   csrf: ""
  60. ---
  61. apiVersion: v1
  62. kind: Secret
  63. metadata:
  64.   labels:
  65.     k8s-app: kubernetes-dashboard
  66.   name: kubernetes-dashboard-key-holder
  67.   namespace: kubernetes-dashboard
  68. type: Opaque
  69. ---
  70. kind: ConfigMap
  71. apiVersion: v1
  72. metadata:
  73.   labels:
  74.     k8s-app: kubernetes-dashboard
  75.   name: kubernetes-dashboard-settings
  76.   namespace: kubernetes-dashboard
  77. ---
  78. kind: Role
  79. apiVersion: rbac.authorization.k8s.io/v1
  80. metadata:
  81.   labels:
  82.     k8s-app: kubernetes-dashboard
  83.   name: kubernetes-dashboard
  84.   namespace: kubernetes-dashboard
  85. rules:
  86.   # Allow Dashboard to get, update and delete Dashboard exclusive secrets.
  87.   - apiGroups: [""]
  88.     resources: ["secrets"]
  89.     resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]
  90.     verbs: ["get", "update", "delete"]
  91.     # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
  92.   - apiGroups: [""]
  93.     resources: ["configmaps"]
  94.     resourceNames: ["kubernetes-dashboard-settings"]
  95.     verbs: ["get", "update"]
  96.     # Allow Dashboard to get metrics.
  97.   - apiGroups: [""]
  98.     resources: ["services"]
  99.     resourceNames: ["heapster", "dashboard-metrics-scraper"]
  100.     verbs: ["proxy"]
  101.   - apiGroups: [""]
  102.     resources: ["services/proxy"]
  103.     resourceNames: ["heapster", "http:heapster:", "https:heapster:", "dashboard-metrics-scraper", "http:dashboard-metrics-scraper"]
  104.     verbs: ["get"]
  105. ---
  106. kind: ClusterRole
  107. apiVersion: rbac.authorization.k8s.io/v1
  108. metadata:
  109.   labels:
  110.     k8s-app: kubernetes-dashboard
  111.   name: kubernetes-dashboard
  112. rules:
  113.   # Allow Metrics Scraper to get metrics from the Metrics server
  114.   - apiGroups: ["metrics.k8s.io"]
  115.     resources: ["pods", "nodes"]
  116.     verbs: ["get", "list", "watch"]
  117. ---
  118. apiVersion: rbac.authorization.k8s.io/v1
  119. kind: RoleBinding
  120. metadata:
  121.   labels:
  122.     k8s-app: kubernetes-dashboard
  123.   name: kubernetes-dashboard
  124.   namespace: kubernetes-dashboard
  125. roleRef:
  126.   apiGroup: rbac.authorization.k8s.io
  127.   kind: Role
  128.   name: kubernetes-dashboard
  129. subjects:
  130.   - kind: ServiceAccount
  131.     name: kubernetes-dashboard
  132.     namespace: kubernetes-dashboard
  133. ---
  134. apiVersion: rbac.authorization.k8s.io/v1
  135. kind: ClusterRoleBinding
  136. metadata:
  137.   name: kubernetes-dashboard
  138. roleRef:
  139.   apiGroup: rbac.authorization.k8s.io
  140.   kind: ClusterRole
  141.   name: kubernetes-dashboard
  142. subjects:
  143.   - kind: ServiceAccount
  144.     name: kubernetes-dashboard
  145.     namespace: kubernetes-dashboard
  146. ---
  147. kind: Deployment
  148. apiVersion: apps/v1
  149. metadata:
  150.   labels:
  151.     k8s-app: kubernetes-dashboard
  152.   name: kubernetes-dashboard
  153.   namespace: kubernetes-dashboard
  154. spec:
  155.   replicas: 1
  156.   revisionHistoryLimit: 10
  157.   selector:
  158.     matchLabels:
  159.       k8s-app: kubernetes-dashboard
  160.   template:
  161.     metadata:
  162.       labels:
  163.         k8s-app: kubernetes-dashboard
  164.     spec:
  165.       containers:
  166.         - name: kubernetes-dashboard
  167.           image: kubernetesui/dashboard:v2.3.1
  168.           imagePullPolicy: Always
  169.           ports:
  170.             - containerPort: 8443
  171.               protocol: TCP
  172.           args:
  173.             - --auto-generate-certificates
  174.             - --namespace=kubernetes-dashboard
  175.             # Uncomment the following line to manually specify Kubernetes API server Host
  176.             # If not specified, Dashboard will attempt to auto discover the API server and connect
  177.             # to it. Uncomment only if the default does not work.
  178.             # - --apiserver-host=http://my-address:port
  179.           volumeMounts:
  180.             - name: kubernetes-dashboard-certs
  181.               mountPath: /certs
  182.               # Create on-disk volume to store exec logs
  183.             - mountPath: /tmp
  184.               name: tmp-volume
  185.           livenessProbe:
  186.             httpGet:
  187.               scheme: HTTPS
  188.               path: /
  189.               port: 8443
  190.             initialDelaySeconds: 30
  191.             timeoutSeconds: 30
  192.           securityContext:
  193.             allowPrivilegeEscalation: false
  194.             readOnlyRootFilesystem: true
  195.             runAsUser: 1001
  196.             runAsGroup: 2001
  197.       volumes:
  198.         - name: kubernetes-dashboard-certs
  199.           secret:
  200.             secretName: kubernetes-dashboard-certs
  201.         - name: tmp-volume
  202.           emptyDir: {}
  203.       serviceAccountName: kubernetes-dashboard
  204.       nodeSelector:
  205.         "kubernetes.io/os": linux
  206.       # Comment the following tolerations if Dashboard must not be deployed on master
  207.       tolerations:
  208.         - key: node-role.kubernetes.io/master
  209.           effect: NoSchedule
  210. ---
  211. kind: Service
  212. apiVersion: v1
  213. metadata:
  214.   labels:
  215.     k8s-app: dashboard-metrics-scraper
  216.   name: dashboard-metrics-scraper
  217.   namespace: kubernetes-dashboard
  218. spec:
  219.   ports:
  220.     - port: 8000
  221.       targetPort: 8000
  222.   selector:
  223.     k8s-app: dashboard-metrics-scraper
  224. ---
  225. kind: Deployment
  226. apiVersion: apps/v1
  227. metadata:
  228.   labels:
  229.     k8s-app: dashboard-metrics-scraper
  230.   name: dashboard-metrics-scraper
  231.   namespace: kubernetes-dashboard
  232. spec:
  233.   replicas: 1
  234.   revisionHistoryLimit: 10
  235.   selector:
  236.     matchLabels:
  237.       k8s-app: dashboard-metrics-scraper
  238.   template:
  239.     metadata:
  240.       labels:
  241.         k8s-app: dashboard-metrics-scraper
  242.       annotations:
  243.         seccomp.security.alpha.kubernetes.io/pod: 'runtime/default'
  244.     spec:
  245.       containers:
  246.         - name: dashboard-metrics-scraper
  247.           image: kubernetesui/metrics-scraper:v1.0.6
  248.           ports:
  249.             - containerPort: 8000
  250.               protocol: TCP
  251.           livenessProbe:
  252.             httpGet:
  253.               scheme: HTTP
  254.               path: /
  255.               port: 8000
  256.             initialDelaySeconds: 30
  257.             timeoutSeconds: 30
  258.           volumeMounts:
  259.           - mountPath: /tmp
  260.             name: tmp-volume
  261.           securityContext:
  262.             allowPrivilegeEscalation: false
  263.             readOnlyRootFilesystem: true
  264.             runAsUser: 1001
  265.             runAsGroup: 2001
  266.       serviceAccountName: kubernetes-dashboard
  267.       nodeSelector:
  268.         "kubernetes.io/os": linux
  269.       # Comment the following tolerations if Dashboard must not be deployed on master
  270.       tolerations:
  271.         - key: node-role.kubernetes.io/master
  272.           effect: NoSchedule
  273.       volumes:
  274.         - name: tmp-volume
  275.           emptyDir: {}
复制代码
6.2 袒露端口

  1. kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
复制代码
type: ClusterIP 改为 type: NodePort
相称于docker中将内部的端口映射到linux的某个端口

找到放行的端口
  1. kubectl get svc -A |grep kubernetes-dashboard
  2. ## 如果是云服务器,找到端口,在安全组放行
复制代码

6.3 访问web界面

访问: https://集群恣意IP:端口 https://192.168.37.110:31820/

发现假造机摆设的无法访问,云服务器则没有题目。
我后口试了试Google、Edge都不可,华为欣赏器、火狐欣赏器可以访问到:

 具体怎么办理,这个我放到背面偶然间再处置处罚吧~


6.4 创建访问账号

创建一个设置文件dash-usr.yaml
  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
复制代码


6.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}}"
复制代码

6.6 登录





七、写在背面的话

值得注意的是,我们的这些kubectl下令都须要在master节点上运行,别整岔劈了!
别的,我们重启后,k8s集群正常来说就会主动启动,只不外部分应用须要时间逐步启动,等他们全部running
如果发现没有重启乐成,那么查抄一下swap交换分区是不是没有关闭?防火墙是不是打开了?docker是不是都启动了?
遇事不要慌,逐一举行排查,这也是处置处罚题目的本事。我在搭建的过程中,也碰到了不少的坑,正常。不外只要严格按照上述过程实行,我信赖题目不大的。
好了,我们下一个阶段见!
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表