草庐IT

Kubernetes Cluster部署

MeeSeeks-B 2023-03-28 原文

 

1、基本环境说明

ip: 192.168.115.149   主机名:node1    CentOS Linux release 7.9.2009,内核版本为3.10.0-1160.81.1.el7.x86_64
ip: 192.168.115.151   主机名:node2    CentOS Linux release 7.9.2009,内核版本为3.10.0-1160.81.1.el7.x86_64
ip: 192.168.115.152   主机名:node3    CentOS Linux release 7.9.2009,内核版本为3.10.0-1160.81.1.el7.x86_64

2、安装说明

安装方式:yum方式安装部署

安装版本:kubelet-1.21.1 kubeadm-1.21.1 kubectl-1.21.1

3、准备工作

说明:  k8s集群涉及到的3台机器都需要进行准备

1、检查ip和uuid:确保每个节点上 MAC 地址和 product_uuid 的唯一性

2、允许 iptables 检查桥接流量:确保 br_netfilter 模块被加载、iptables 能够正确地查看桥接流量、设置路由

3、关闭系统的selinux、防火墙、Swap

4、修改主机名,添加hosts

5、安装好docker: 注意docker和k8s的版本对应关系,并设置设置cgroup驱动,这里用systemd,否则后续kubeadm init会有相关warning。

  docker安装参考文档:Linux下docker安装部署 - MeeSeeks-B - 博客园 (cnblogs.com)

 1 ===1.检查ip和uuid
 2 ip a
 3 cat /sys/class/dmi/id/product_uuid
 4 
 5 ===2.允许 iptables 检查桥接流量
 6 1.确保 br_netfilter 模块被加载
 7 #显示已载入系统的模块
 8 lsmod | grep br_netfilter 
 9 #如果未加载则加载该模块
10 modprobe br_netfilter 
11 2.iptables 能够正确地查看桥接流量
12 确保在sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1
13 sysctl -a |grep net.bridge.bridge-nf-call-iptables
14 3.设置路由
15 cat <<EOF | tee /etc/modules-load.d/k8s.conf
16 br_netfilter
17 EOF
18 
19 cat <<EOF | tee /etc/sysctl.d/k8s.conf
20 net.bridge.bridge-nf-call-ip6tables = 1
21 net.bridge.bridge-nf-call-iptables = 1
22 EOF
23 
24 sysctl --system
25 
26 ===3.关闭selinux
27 setenforce 0 //临时关闭selinux,重启后失效
28 #永久关闭,休修改文件后重启服务器即可
29 vim /etc/selinux/config
30 #修改SELINUX=enforcing  为 
31 SELINUX=disabled
32 
33 ===4.关闭防火墙
34 systemctl status firewalld
35 systemctl stop firewalld
36 
37 ===5.关闭Swap
38 #临时关闭
39 swapoff -a
40 #永久关闭
41 vim /etc/fstab
42 注释掉 SWAP 的自动挂载
43 
44 vim /etc/sysctl.d/k8s.conf  (可选)
45 添加下面一行:
46 vm.swappiness=0
47 
48 sysctl -p /etc/sysctl.d/k8s.conf
准备工作

 

 

4、安装kubeadm,kubelet和kubectl

说明:  k8s集群涉及到的3台机器都需要进行准备,安装的版本为kubelet-1.21.1 kubeadm-1.21.1 kubectl-1.21.1

#添加k8s阿里云YUM软件源
vim /etc/yum.repos.d/kubernetes.repo
[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

#安装kubeadm,kubelet和kubectl,注意和docker版本对应
yum install -y kubelet-1.21.1 kubeadm-1.21.1 kubectl-1.21.1

#启动,注意master节点
systemctl start kubelet
systemctl enable kubelet
systemctl status kubelet 

5、集群部署

说明: 主要是对master节点初始化和node节点的接入

#master节点部署初始化master节点
kubeadm init   --apiserver-advertise-address=192.168.115.149 --image-repository registry.aliyuncs.com/google_containers   --kubernetes-version v1.21.1   --service-cidr=10.140.0.0/16 --pod-network-cidr=10.240.0.0/16

6、安装网络插件

说明:master节点安装,可安装flannel插件也可安装安装calico插件,此处安装flannel插件

  1 vim kube-flannel.yml
  2 ---
  3 apiVersion: policy/v1beta1
  4 kind: PodSecurityPolicy
  5 metadata:
  6   name: psp.flannel.unprivileged
  7   annotations:
  8     seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
  9     seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
 10     apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
 11     apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
 12 spec:
 13   privileged: false
 14   volumes:
 15   - configMap
 16   - secret
 17   - emptyDir
 18   - hostPath
 19   allowedHostPaths:
 20   - pathPrefix: "/etc/cni/net.d"
 21   - pathPrefix: "/etc/kube-flannel"
 22   - pathPrefix: "/run/flannel"
 23   readOnlyRootFilesystem: false
 24   runAsUser:
 25     rule: RunAsAny
 26   supplementalGroups:
 27     rule: RunAsAny
 28   fsGroup:
 29     rule: RunAsAny
 30   allowPrivilegeEscalation: false
 31   defaultAllowPrivilegeEscalation: false
 32   allowedCapabilities: ['NET_ADMIN', 'NET_RAW']
 33   defaultAddCapabilities: []
 34   requiredDropCapabilities: []
 35   hostPID: false
 36   hostIPC: false
 37   hostNetwork: true
 38   hostPorts:
 39   - min: 0
 40     max: 65535
 41   seLinux:
 42     rule: 'RunAsAny'
 43 ---
 44 kind: ClusterRole
 45 apiVersion: rbac.authorization.k8s.io/v1
 46 metadata:
 47   name: flannel
 48 rules:
 49 - apiGroups: ['extensions']
 50   resources: ['podsecuritypolicies']
 51   verbs: ['use']
 52   resourceNames: ['psp.flannel.unprivileged']
 53 - apiGroups:
 54   - ""
 55   resources:
 56   - pods
 57   verbs:
 58   - get
 59 - apiGroups:
 60   - ""
 61   resources:
 62   - nodes
 63   verbs:
 64   - list
 65   - watch
 66 - apiGroups:
 67   - ""
 68   resources:
 69   - nodes/status
 70   verbs:
 71   - patch
 72 ---
 73 kind: ClusterRoleBinding
 74 apiVersion: rbac.authorization.k8s.io/v1
 75 metadata:
 76   name: flannel
 77 roleRef:
 78   apiGroup: rbac.authorization.k8s.io
 79   kind: ClusterRole
 80   name: flannel
 81 subjects:
 82 - kind: ServiceAccount
 83   name: flannel
 84   namespace: kube-system
 85 ---
 86 apiVersion: v1
 87 kind: ServiceAccount
 88 metadata:
 89   name: flannel
 90   namespace: kube-system
 91 ---
 92 kind: ConfigMap
 93 apiVersion: v1
 94 metadata:
 95   name: kube-flannel-cfg
 96   namespace: kube-system
 97   labels:
 98     tier: node
 99     app: flannel
100 data:
101   cni-conf.json: |
102     {
103       "name": "cbr0",
104       "cniVersion": "0.3.1",
105       "plugins": [
106         {
107           "type": "flannel",
108           "delegate": {
109             "hairpinMode": true,
110             "isDefaultGateway": true
111           }
112         },
113         {
114           "type": "portmap",
115           "capabilities": {
116             "portMappings": true
117           }
118         }
119       ]
120     }
121   net-conf.json: |
122     {
123       "Network": "10.244.0.0/16",
124       "Backend": {
125         "Type": "vxlan"
126       }
127     }
128 ---
129 apiVersion: apps/v1
130 kind: DaemonSet
131 metadata:
132   name: kube-flannel-ds
133   namespace: kube-system
134   labels:
135     tier: node
136     app: flannel
137 spec:
138   selector:
139     matchLabels:
140       app: flannel
141   template:
142     metadata:
143       labels:
144         tier: node
145         app: flannel
146     spec:
147       affinity:
148         nodeAffinity:
149           requiredDuringSchedulingIgnoredDuringExecution:
150             nodeSelectorTerms:
151             - matchExpressions:
152               - key: kubernetes.io/os
153                 operator: In
154                 values:
155                 - linux
156       hostNetwork: true
157       priorityClassName: system-node-critical
158       tolerations:
159       - operator: Exists
160         effect: NoSchedule
161       serviceAccountName: flannel
162       initContainers:
163       - name: install-cni-plugin
164         image: rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.0
165         command:
166         - cp
167         args:
168         - -f
169         - /flannel
170         - /opt/cni/bin/flannel
171         volumeMounts:
172         - name: cni-plugin
173           mountPath: /opt/cni/bin
174       - name: install-cni
175         image: rancher/mirrored-flannelcni-flannel:v0.18.1
176         command:
177         - cp
178         args:
179         - -f
180         - /etc/kube-flannel/cni-conf.json
181         - /etc/cni/net.d/10-flannel.conflist
182         volumeMounts:
183         - name: cni
184           mountPath: /etc/cni/net.d
185         - name: flannel-cfg
186           mountPath: /etc/kube-flannel/
187       containers:
188       - name: kube-flannel
189         image: rancher/mirrored-flannelcni-flannel:v0.18.1
190         command:
191         - /opt/bin/flanneld
192         args:
193         - --ip-masq
194         - --kube-subnet-mgr
195         resources:
196           requests:
197             cpu: "100m"
198             memory: "50Mi"
199           limits:
200             cpu: "100m"
201             memory: "50Mi"
202         securityContext:
203           privileged: false
204           capabilities:
205             add: ["NET_ADMIN", "NET_RAW"]
206         env:
207         - name: POD_NAME
208           valueFrom:
209             fieldRef:
210               fieldPath: metadata.name
211         - name: POD_NAMESPACE
212           valueFrom:
213             fieldRef:
214               fieldPath: metadata.namespace
215         - name: EVENT_QUEUE_DEPTH
216           value: "5000"
217         volumeMounts:
218         - name: run
219           mountPath: /run/flannel
220         - name: flannel-cfg
221           mountPath: /etc/kube-flannel/
222         - name: xtables-lock
223           mountPath: /run/xtables.lock
224       volumes:
225       - name: run
226         hostPath:
227           path: /run/flannel
228       - name: cni-plugin
229         hostPath:
230           path: /opt/cni/bin
231       - name: cni
232         hostPath:
233           path: /etc/cni/net.d
234       - name: flannel-cfg
235         configMap:
236           name: kube-flannel-cfg
237       - name: xtables-lock
238         hostPath:
239           path: /run/xtables.lock
240           type: FileOrCreate
vim kube-flannel.yml
#修改net-conf.json
下面的网段为上面初始化master pod-network-cidr的网段地址
sed -i 's/10.244.0.0/10.240.0.0/' kube-flannel.yml

#执行
kubectl apply -f kube-flannel.yml

#执行查看安装的状态
 kubectl get pods --all-namespaces

#查看集群的状态是否为ready
kubectl get nodes

===补充卸载flannel================

7、测试kubernetes集群

说明:创建一个pod,开放对外端口访问,这里会随机映射一个端口,不指定ns,会默认创建在default下

kubectl create deployment nginx --image=nginx

kubectl expose deployment nginx --port=80 --type=NodePort

 

8、问题总结

 8.1、master节点启动kubelet异常

查看kubelet状态有如下报错属正常现象,正常进行master初始化即可

8.2、master初始化问题处理

执行kubeadm init   --apiserver-advertise-address=192.168.115.149  --kubernetes-version v1.21.1   --service-cidr=10.140.0.0/16 --pod-network-cidr=10.240.0.0/16 

报错如下:

 原因分析:由于国内网络原因,kubeadm init会卡住不动,一卡就是很长时间,然后报出这种问题,kubeadm init未设置镜像地址,就默认下载k8s.gcr.io的docker镜像,但是国内连不上https://k8s.gcr.io/v2/

 解决方案:kubeadm init添加镜像地址,执行kubeadm init   --apiserver-advertise-address=192.168.115.149 --image-repository registry.aliyuncs.com/google_containers   --kubernetes-version v1.21.1   --service-cidr=10.140.0.0/16 --pod-network-cidr=10.240.0.0/16

报错如下:

 原因分析:拉取 registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0镜像失败

解决方案:可查询需要下载的镜像,手动拉取镜像修改tag

#查询需要下载的镜像  kubeadm config images list

#查询镜像 docker images

发现已经有coredns:v1.8.0镜像但是tag不一样,修改

docker tag registry.aliyuncs.com/google_containers/coredns:v1.8.0 registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0 

再次执行kubeadm init   --apiserver-advertise-address=192.168.115.149 --image-repository registry.aliyuncs.com/google_containers   --kubernetes-version v1.21.1   --service-cidr=10.140.0.0/16 --pod-network-cidr=10.240.0.0/16

成功!!!!!

 8.3 kernel:NMI watchdog: BUG: soft lockup - CPU#1 stuck for 22s! [ksoftirqd/1:14] 

大量高负载程序,造成cpu soft lockup。
Soft lockup就是内核软死锁,这个bug没有让系统彻底死机,但是若干个进程(或者kernel thread)被锁死在了某个状态(一般在内核区域),很多情况下这个是由于内核锁的使用的问题。

解决方案:

https://blog.csdn.net/qq_44710568/article/details/104843432

https://blog.csdn.net/JAVA_LuZiMaKei/article/details/120140987

KubernetesClusterspanstylecolor

有关Kubernetes Cluster部署的更多相关文章

  1. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  2. ruby-on-rails - Ruby on Rails 可以部署在 Azure 网站上吗? - 2

    我可以在Azure网站上部署RubyonRails吗? 最佳答案 还没有。目前仅支持.NET和PHP。 关于ruby-on-rails-RubyonRails可以部署在Azure网站上吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/12964010/

  3. jenkins部署1--jenkins+gitee持续集成 - 2

    前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon

  4. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  5. Ruby,使用包含 TK GUI 的 ocra 部署一个 exe - 2

    Ocra无法处理需要“tk”的应用程序require'tk'puts'nope'用奥克拉http://github.com/larsch/ocra不起作用(如链接中的一个问题所述)问题:https://github.com/larsch/ocra/issues/29(Ocra是1.9的"new"rubyscript2exe,本质上它用于将rb脚本部署为可执行文件)唯一的问题似乎是缺少tcl的DLL文件我不认为这是一个问题据我所知,问题是缺少tk的DLL文件如果它们是已知的,则可以在执行ocra时将它们包括在内有没有办法知道tk工作所需的DLL依赖项? 最佳答

  6. ruby-on-rails - NameError(未初始化常量 Unzipper::Zip)但仅在 Heroku 部署(Rails)上 - 2

    我有一个类unzipper.rb,它使用Rubyzip解压文件。在我的本地环境中,我可以成功解压缩文件,而无需使用require'zip'明确包含依赖项但是在Heroku上,我得到一个NameError(uninitializedconstantUnzipper::Zip)我只能通过使用明确的require来解决问题:为什么这在H​​eroku环境中是必需的,但在本地主机上却不是?我的印象是Rails自动需要所有gem。app/services/unzipper.rbrequire'zip'#OnlyrequiredforHeroku.Workslocallywithout!class

  7. ruby - Sinatra + Heroku + Datamapper 使用 dm-sqlite-adapter 部署问题 - 2

    出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t

  8. ruby-on-rails - 在服务器上没有互联网访问权限的 Capistrano 部署 - 2

    如何使用Capistrano将Rails应用程序部署到无法访问外部网络或存储库的生产或暂存服务器?我已经设法完成部署的一半,并意识到Capistrano没有在我的本地机器上下载gitrepo,但它首先连接到远程服务器并尝试在那里下载Git存储库。我希望有一个类似Javaee的构建系统,其中创建可交付成果并将该可交付成果发送到服务器。就像您构建.ear文件并将其部署到您想要的任何服务器上一样。显然在RoR中,你被迫(据我所知)在该服务器上构建应用程序,在那里创建一个gem存储库,在那里克隆最新的分支等等。有什么方法可以将准备运行的包发送到远程服务器吗? 最佳答

  9. Streampark集成Cloudera Flink、ldap、告警,以及部署常见问题 - 2

    集成背景我们当前集群使用的是ClouderaCDP,Flink版本为ClouderaVersion1.14,整体Flink安装目录以及配置文件结构与社区版本有较大出入。直接根据Streampark官方文档进行部署,将无法配置FlinkHome,以及后续整体Flink任务提交到集群中,因此需要进行针对化适配集成,在满足使用需求上,尽量提供完整的Streampark使用体验。集成步骤版本匹配问题解决首先解决无法识别Cloudera中的FlinkHome问题,根据报错主要明确到的事情是无法读取到Flink版本、lib下面的jar包名称无法匹配。修改对象:修改源码:(解决无法匹配clouderajar

  10. ruby - 部署 Rack 应用程序的可靠方法 (Sinatra) - 2

    我正在寻找一种可靠的方式来部署Rack应用程序(在本例中为Sinatra应用程序)。请求将花费一些时间(0.25-0.5秒等待代理HTTP请求)并且可能会有相当大的流量。我应该使用传统的mongrel集群设置吗?使用HAProxy作为负载均衡器?恩金克斯?架子?您使用过哪些解决方案,有哪些优势? 最佳答案 Nginx/unicornFTW!前面的Nginx提供静态文件和unicorn处理Sinatra应用程序。优点:性能、使用unixsocks的良好负载平衡以及无需停机即可部署/升级(您可以在不停机的情况下升级Ruby/Nginx/

随机推荐