0


Linux安装Kubernetes(k8s)详细教程

系统初始化

生产环境肯定要更高配置,虚拟机以保守的最低配置。

机器ip规格master192.168.203.111核2线程、2G内存、40G磁盘node2192.168.203.121核2线程、2G内存、40G磁盘node3192.168.203.131核2线程、2G内存、40G磁盘

修改为静态ip

  1. vi /etc/resolv.conf

追加内容后保存并退出

  1. nameserver 223.5.5.5
  2. nameserver 223.6.6.6
  1. sudovi /etc/sysconfig/network-scripts/ifcfg-ens33

BOOTPROTO="dhcp"改成BOOTPROTO=“static”,如果是复制的机器UUID、IPADDR也要不一致

  1. TYPE="Ethernet"PROXY_METHOD="none"BROWSER_ONLY="no"BOOTPROTO="static"DEFROUTE="yes"IPV4_FAILURE_FATAL="no"IPV6INIT="yes"IPV6_AUTOCONF="yes"IPV6_DEFROUTE="yes"IPV6_FAILURE_FATAL="no"IPV6_ADDR_GEN_MODE="stable-privacy"NAME="ens33"UUID="0ef41c81-2fa8-405d-9ab5-3ff34ac815cf"DEVICE="ens33"ONBOOT="yes"IPADDR="192.168.203.11"PREFIX="24"GATEWAY="192.168.203.2"IPV6_PRIVACY="no"

重启网络使配置生效

  1. sudo systemctl restart network

永久关闭防火墙(所有机器)

  1. sudo systemctl stop firewalld && systemctl disable firewalld

永久关闭selinux(所有机器)

  1. sudosed-i's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

启用selinux命令:setenforce 0【不需要执行,只是作为一种记录】

永久禁止swap分区(所有机器)

  1. sudosed-ri's/.*swap.*/#&/' /etc/fstab

永久设置hostname(根据机器分别设置mster、node1、node2)

三台机器分别为mster、node1、node2

  1. sudo hostnamectl set-hostname master

使用hostnamectl或hostname命令验证是否修改成功

在hosts文件添加内容(仅master设置)

  1. sudocat>> /etc/hosts <<EOF
  2. 192.168.203.11 master
  3. 192.168.203.12 node1
  4. 192.168.203.13 node2
  5. EOF

将桥接的IPv4流量传递到iptables的链(所有机器)

  1. sudocat> /etc/sysctl.d/k8s.conf <<EOF
  2. net.bridge.bridge-nf-call-ip6tables = 1
  3. net.bridge.bridge-nf-call-iptables = 1
  4. net.ipv4.ip_forward = 1
  5. vm.swappiness = 0
  6. EOF

使k8s.conf立即生效

  1. sudosysctl--system

时间同步(所有机器)

  1. sudo yum install-y ntpdate

安装好后执行同步时间命令

  1. sudo ntpdate time.windows.com

所有机器安装Docker、Kubeadm、Kubelet、Kubectl

安装Docker

安装必要的一些系统工具

  1. yum install-y net-tools
  2. yum install-ywgetsudo yum install-y yum-utils device-mapper-persistent-data lvm2

安装配置管理和设置镜像源

  1. sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  2. sudosed-i's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

查找Docker-CE的版本

  1. sudo yum list docker-ce.x86_64 --showduplicates|sort-r

安装指定版本的docker-ce
sudo yum -y install docker-ce-[VERSION]

  1. sudo yum -yinstall docker-ce-18.06.1.ce-3.el7

启动docker服务

  1. sudo systemctl enabledocker&&sudo systemctl start docker

查看docker是否启动成功【注意docker的Client和Server要一致,否则某些情况下会报错】

  1. sudodocker--version

创建/etc/docker/daemon.json文件并设置docker仓库为aliyun仓库

  1. sudocat> /etc/docker/daemon.json <<EOF
  2. {
  3. "registry-mirrors":["https://b9pmyelo.mirror.aliyuncs.com"]
  4. }
  5. EOF

重启docker查看配置是否生效

  1. sudodocker info

重启

  1. sudoreboot now

添加yum软件源kubernetes.repo为阿里云

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

安装 kubelet、kubeadm、kubectl

  1. sudo yum install-y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

设置开机启动和启动

  1. sudo systemctl enable kubelet && systemctl start kubelet

部署Kubernetes

apiserver-advertise-address表示master主机ip
image-repository表示镜像仓库
kubernetes-version表示k8s的版本,跟上面的kubelet、kubeadm、kubectl版本一致
service-cidr表示集群内部虚拟网络,Pod统一访问入口
pod-network-cidr表示Pod网络,与下面部署的CNI网络组件yaml中保持一致

Kubernetes初始化【仅master执行,过程可能会有点久,请耐心等待命令行输出】

–v=5可加可不加,建议加,输出完整的日志,方便排查问题

  1. kubeadm init \--v=5\
  2. --apiserver-advertise-address=192.168.203.11 \
  3. --image-repository=registry.aliyuncs.com/google_containers \
  4. --kubernetes-version=v1.18.0 \
  5. --service-cidr=10.96.0.0/12 \
  6. --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. sudocp-i /etc/kubernetes/admin.conf $HOME/.kube/config
  5. sudochown$(id-u):$(id-g)$HOME/.kube/config
  6. You should now deploy a pod network to the cluster.
  7. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  8. https://kubernetes.io/docs/concepts/cluster-administration/addons/
  9. Then you can join any number of worker nodes by running the following on each as root:
  10. kubeadm join192.168.203.11:6443 --token 51c0rb.ehwwxemgec75r1g6 \
  11. --discovery-token-ca-cert-hash sha256:fad429370f462b36d2651e3e37be4d4b34e63d0378966a1532442dc3f67e41b4

根据上面的提示执行对应的To start using your cluster, you need to run the following as a regular user:命令

master节点执行,node节点不执行
kubectl get nodes查看节点信息

  1. mkdir-p$HOME/.kube
  2. sudocp-i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. sudochown$(id-u):$(id-g)$HOME/.kube/config
  4. kubectl get nodes

node节点根据上面的提示执行对应的Then you can join any number of worker nodes by running the following on each as root:命令

node节点执行,master节点不执行

  1. kubeadm join192.168.203.11:6443 --token 51c0rb.ehwwxemgec75r1g6 \
  2. --discovery-token-ca-cert-hash sha256:fad429370f462b36d2651e3e37be4d4b34e63d0378966a1532442dc3f67e41b4

node1和node2执行命令

安装cni

kube-flannel-ds-amd.yml文件

  1. ---apiVersion: policy/v1beta1
  2. kind: PodSecurityPolicy
  3. metadata:name: psp.flannel.unprivileged
  4. annotations:seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
  5. seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
  6. apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
  7. apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
  8. spec:privileged:falsevolumes:- configMap
  9. - secret
  10. - emptyDir
  11. - hostPath
  12. allowedHostPaths:-pathPrefix:"/etc/cni/net.d"-pathPrefix:"/etc/kube-flannel"-pathPrefix:"/run/flannel"readOnlyRootFilesystem:false# Users and groupsrunAsUser:rule: RunAsAny
  13. supplementalGroups:rule: RunAsAny
  14. fsGroup:rule: RunAsAny
  15. # Privilege EscalationallowPrivilegeEscalation:falsedefaultAllowPrivilegeEscalation:false# CapabilitiesallowedCapabilities:['NET_ADMIN']defaultAddCapabilities:[]requiredDropCapabilities:[]# Host namespaceshostPID:falsehostIPC:falsehostNetwork:truehostPorts:-min:0max:65535# SELinuxseLinux:# SELinux is unused in CaaSPrule:'RunAsAny'---kind: ClusterRole
  16. apiVersion: rbac.authorization.k8s.io/v1beta1
  17. metadata:name: flannel
  18. rules:-apiGroups:['extensions']resources:['podsecuritypolicies']verbs:['use']resourceNames:['psp.flannel.unprivileged']-apiGroups:-""resources:- pods
  19. verbs:- get
  20. -apiGroups:-""resources:- nodes
  21. verbs:- list
  22. - watch
  23. -apiGroups:-""resources:- nodes/status
  24. verbs:- patch
  25. ---kind: ClusterRoleBinding
  26. apiVersion: rbac.authorization.k8s.io/v1beta1
  27. metadata:name: flannel
  28. roleRef:apiGroup: rbac.authorization.k8s.io
  29. kind: ClusterRole
  30. name: flannel
  31. subjects:-kind: ServiceAccount
  32. name: flannel
  33. namespace: kube-system
  34. ---apiVersion: v1
  35. kind: ServiceAccount
  36. metadata:name: flannel
  37. namespace: kube-system
  38. ---kind: ConfigMap
  39. apiVersion: v1
  40. metadata:name: kube-flannel-cfg
  41. namespace: kube-system
  42. labels:tier: node
  43. app: flannel
  44. data:cni-conf.json:|
  45. {
  46. "name": "cbr0",
  47. "cniVersion": "0.3.1",
  48. "plugins": [
  49. {
  50. "type": "flannel",
  51. "delegate": {
  52. "hairpinMode": true,
  53. "isDefaultGateway": true
  54. }
  55. },
  56. {
  57. "type": "portmap",
  58. "capabilities": {
  59. "portMappings": true
  60. }
  61. }
  62. ]
  63. }net-conf.json:|
  64. {
  65. "Network": "10.244.0.0/16",
  66. "Backend": {
  67. "Type": "vxlan"
  68. }
  69. }---apiVersion: apps/v1
  70. kind: DaemonSet
  71. metadata:name: kube-flannel-ds-amd64
  72. namespace: kube-system
  73. labels:tier: node
  74. app: flannel
  75. spec:selector:matchLabels:app: flannel
  76. template:metadata:labels:tier: node
  77. app: flannel
  78. spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:-matchExpressions:-key: beta.kubernetes.io/os
  79. operator: In
  80. values:- linux
  81. -key: beta.kubernetes.io/arch
  82. operator: In
  83. values:- amd64
  84. hostNetwork:truetolerations:-operator: Exists
  85. effect: NoSchedule
  86. serviceAccountName: flannel
  87. initContainers:-name: install-cni
  88. image: quay.io/coreos/flannel:v0.13.0-rc2
  89. command:- cp
  90. args:--f
  91. - /etc/kube-flannel/cni-conf.json
  92. - /etc/cni/net.d/10-flannel.conflist
  93. volumeMounts:-name: cni
  94. mountPath: /etc/cni/net.d
  95. -name: flannel-cfg
  96. mountPath: /etc/kube-flannel/
  97. containers:-name: kube-flannel
  98. image: quay.io/coreos/flannel:v0.13.0-rc2
  99. command:- /opt/bin/flanneld
  100. args:---ip-masq
  101. ---kube-subnet-mgr
  102. resources:requests:cpu:"100m"memory:"50Mi"limits:cpu:"100m"memory:"50Mi"securityContext:privileged:falsecapabilities:add:["NET_ADMIN"]env:-name: POD_NAME
  103. valueFrom:fieldRef:fieldPath: metadata.name
  104. -name: POD_NAMESPACE
  105. valueFrom:fieldRef:fieldPath: metadata.namespace
  106. volumeMounts:-name: run
  107. mountPath: /run/flannel
  108. -name: flannel-cfg
  109. mountPath: /etc/kube-flannel/
  110. volumes:-name: run
  111. hostPath:path: /run/flannel
  112. -name: cni
  113. hostPath:path: /etc/cni/net.d
  114. -name: flannel-cfg
  115. configMap:name: kube-flannel-cfg
  116. ---apiVersion: apps/v1
  117. kind: DaemonSet
  118. metadata:name: kube-flannel-ds-arm64
  119. namespace: kube-system
  120. labels:tier: node
  121. app: flannel
  122. spec:selector:matchLabels:app: flannel
  123. template:metadata:labels:tier: node
  124. app: flannel
  125. spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:-matchExpressions:-key: beta.kubernetes.io/os
  126. operator: In
  127. values:- linux
  128. -key: beta.kubernetes.io/arch
  129. operator: In
  130. values:- arm64
  131. hostNetwork:truetolerations:-operator: Exists
  132. effect: NoSchedule
  133. serviceAccountName: flannel
  134. initContainers:-name: install-cni
  135. image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-arm64
  136. command:- cp
  137. args:--f
  138. - /etc/kube-flannel/cni-conf.json
  139. - /etc/cni/net.d/10-flannel.conflist
  140. volumeMounts:-name: cni
  141. mountPath: /etc/cni/net.d
  142. -name: flannel-cfg
  143. mountPath: /etc/kube-flannel/
  144. containers:-name: kube-flannel
  145. image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-arm64
  146. command:- /opt/bin/flanneld
  147. args:---ip-masq
  148. ---kube-subnet-mgr
  149. resources:requests:cpu:"100m"memory:"50Mi"limits:cpu:"100m"memory:"50Mi"securityContext:privileged:falsecapabilities:add:["NET_ADMIN"]env:-name: POD_NAME
  150. valueFrom:fieldRef:fieldPath: metadata.name
  151. -name: POD_NAMESPACE
  152. valueFrom:fieldRef:fieldPath: metadata.namespace
  153. volumeMounts:-name: run
  154. mountPath: /run/flannel
  155. -name: flannel-cfg
  156. mountPath: /etc/kube-flannel/
  157. volumes:-name: run
  158. hostPath:path: /run/flannel
  159. -name: cni
  160. hostPath:path: /etc/cni/net.d
  161. -name: flannel-cfg
  162. configMap:name: kube-flannel-cfg
  163. ---apiVersion: apps/v1
  164. kind: DaemonSet
  165. metadata:name: kube-flannel-ds-arm
  166. namespace: kube-system
  167. labels:tier: node
  168. app: flannel
  169. spec:selector:matchLabels:app: flannel
  170. template:metadata:labels:tier: node
  171. app: flannel
  172. spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:-matchExpressions:-key: beta.kubernetes.io/os
  173. operator: In
  174. values:- linux
  175. -key: beta.kubernetes.io/arch
  176. operator: In
  177. values:- arm
  178. hostNetwork:truetolerations:-operator: Exists
  179. effect: NoSchedule
  180. serviceAccountName: flannel
  181. initContainers:-name: install-cni
  182. image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-arm
  183. command:- cp
  184. args:--f
  185. - /etc/kube-flannel/cni-conf.json
  186. - /etc/cni/net.d/10-flannel.conflist
  187. volumeMounts:-name: cni
  188. mountPath: /etc/cni/net.d
  189. -name: flannel-cfg
  190. mountPath: /etc/kube-flannel/
  191. containers:-name: kube-flannel
  192. image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-arm
  193. command:- /opt/bin/flanneld
  194. args:---ip-masq
  195. ---kube-subnet-mgr
  196. resources:requests:cpu:"100m"memory:"50Mi"limits:cpu:"100m"memory:"50Mi"securityContext:privileged:falsecapabilities:add:["NET_ADMIN"]env:-name: POD_NAME
  197. valueFrom:fieldRef:fieldPath: metadata.name
  198. -name: POD_NAMESPACE
  199. valueFrom:fieldRef:fieldPath: metadata.namespace
  200. volumeMounts:-name: run
  201. mountPath: /run/flannel
  202. -name: flannel-cfg
  203. mountPath: /etc/kube-flannel/
  204. volumes:-name: run
  205. hostPath:path: /run/flannel
  206. -name: cni
  207. hostPath:path: /etc/cni/net.d
  208. -name: flannel-cfg
  209. configMap:name: kube-flannel-cfg
  210. ---apiVersion: apps/v1
  211. kind: DaemonSet
  212. metadata:name: kube-flannel-ds-ppc64le
  213. namespace: kube-system
  214. labels:tier: node
  215. app: flannel
  216. spec:selector:matchLabels:app: flannel
  217. template:metadata:labels:tier: node
  218. app: flannel
  219. spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:-matchExpressions:-key: beta.kubernetes.io/os
  220. operator: In
  221. values:- linux
  222. -key: beta.kubernetes.io/arch
  223. operator: In
  224. values:- ppc64le
  225. hostNetwork:truetolerations:-operator: Exists
  226. effect: NoSchedule
  227. serviceAccountName: flannel
  228. initContainers:-name: install-cni
  229. image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-ppc64le
  230. command:- cp
  231. args:--f
  232. - /etc/kube-flannel/cni-conf.json
  233. - /etc/cni/net.d/10-flannel.conflist
  234. volumeMounts:-name: cni
  235. mountPath: /etc/cni/net.d
  236. -name: flannel-cfg
  237. mountPath: /etc/kube-flannel/
  238. containers:-name: kube-flannel
  239. image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-ppc64le
  240. command:- /opt/bin/flanneld
  241. args:---ip-masq
  242. ---kube-subnet-mgr
  243. resources:requests:cpu:"100m"memory:"50Mi"limits:cpu:"100m"memory:"50Mi"securityContext:privileged:falsecapabilities:add:["NET_ADMIN"]env:-name: POD_NAME
  244. valueFrom:fieldRef:fieldPath: metadata.name
  245. -name: POD_NAMESPACE
  246. valueFrom:fieldRef:fieldPath: metadata.namespace
  247. volumeMounts:-name: run
  248. mountPath: /run/flannel
  249. -name: flannel-cfg
  250. mountPath: /etc/kube-flannel/
  251. volumes:-name: run
  252. hostPath:path: /run/flannel
  253. -name: cni
  254. hostPath:path: /etc/cni/net.d
  255. -name: flannel-cfg
  256. configMap:name: kube-flannel-cfg
  257. ---apiVersion: apps/v1
  258. kind: DaemonSet
  259. metadata:name: kube-flannel-ds-s390x
  260. namespace: kube-system
  261. labels:tier: node
  262. app: flannel
  263. spec:selector:matchLabels:app: flannel
  264. template:metadata:labels:tier: node
  265. app: flannel
  266. spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:-matchExpressions:-key: beta.kubernetes.io/os
  267. operator: In
  268. values:- linux
  269. -key: beta.kubernetes.io/arch
  270. operator: In
  271. values:- s390x
  272. hostNetwork:truetolerations:-operator: Exists
  273. effect: NoSchedule
  274. serviceAccountName: flannel
  275. initContainers:-name: install-cni
  276. image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-s390x
  277. command:- cp
  278. args:--f
  279. - /etc/kube-flannel/cni-conf.json
  280. - /etc/cni/net.d/10-flannel.conflist
  281. volumeMounts:-name: cni
  282. mountPath: /etc/cni/net.d
  283. -name: flannel-cfg
  284. mountPath: /etc/kube-flannel/
  285. containers:-name: kube-flannel
  286. image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-s390x
  287. command:- /opt/bin/flanneld
  288. args:---ip-masq
  289. ---kube-subnet-mgr
  290. resources:requests:cpu:"100m"memory:"50Mi"limits:cpu:"100m"memory:"50Mi"securityContext:privileged:falsecapabilities:add:["NET_ADMIN"]env:-name: POD_NAME
  291. valueFrom:fieldRef:fieldPath: metadata.name
  292. -name: POD_NAMESPACE
  293. valueFrom:fieldRef:fieldPath: metadata.namespace
  294. volumeMounts:-name: run
  295. mountPath: /run/flannel
  296. -name: flannel-cfg
  297. mountPath: /etc/kube-flannel/
  298. volumes:-name: run
  299. hostPath:path: /run/flannel
  300. -name: cni
  301. hostPath:path: /etc/cni/net.d
  302. -name: flannel-cfg
  303. configMap:name: kube-flannel-cfg
  1. docker pull quay.io/coreos/flannel:v0.13.0-rc2
  2. kubectl apply -f kube-flannel-ds-amd.yml

kubectl get pod -n kube-system 查看kube-flannel-ds-XXX 是否为runnin状态

  1. systemctl restart kubelet
  2. kubectl get pod -n kube-system

master执行

  1. kubectl get node

node1和node2节点处于Ready状态

  1. [root@master ~]# kubectl get node
  2. NAME STATUS ROLES AGE VERSION
  3. master Ready master 50m v1.18.0
  4. node1 Ready <none> 49m v1.18.0
  5. node2 Ready <none> 49m v1.18.0

master部署CNI网络插件【如果前面没有把–network-plugin=cni移除并重启kubelet,这步很可能会报错】

  1. kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  2. kubectl get pods -n kube-system
  3. kubectl get node

master执行测试Kubernetes(k8s)集群

  1. kubectl create deployment nginx --image=nginx
  2. kubectl expose deployment nginx --port=80 --type=NodePort
  3. kubectl get pod,svc

输出如下

  1. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  2. service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 21m
  3. service/nginx NodePort 10.108.8.133 <none> 80:30008/TCP 111s

如果nginx启动失败,则进行删除

  1. kubectl delete service nginx
标签: linux kubernetes 运维

本文转载自: https://blog.csdn.net/weixin_43933728/article/details/137977799
版权归原作者 Meta39 所有, 如有侵权,请联系我们删除。

“Linux安装Kubernetes(k8s)详细教程”的评论:

还没有评论