当前位置:   article > 正文

K8S集群_阿里云 flannel镜像

阿里云 flannel镜像

概念:

  1. cluster:计算,存储和网络资源的集合,kubernetes通过这些资源管理容器
  2. master:cluster的大脑,负责调度,决定pod在哪个node上运行
  3. node:pod运行的地方,node负责监控容器的状态,并向master汇报,并根据master的要求管理容器的生命周期
  4. pod:kubernetes的最小工作单元,pod中运行着一个或多个容器,这些容器会作为一个整体被master调度到node上运行
  5. controller:kubernetes通过controller管理pod
  6. service:service为外界提供访问pod的ip,pod可能会被频繁的创建和销毁,但service不变
  7. namespace:可以将cluster划分为多个cluster(default、system、public)

master:

  1. kube-apiserver:k8s的前端接口和其他组件通过apiserver管理集群各种资源
  2. kube-scheduler:决定pod在哪个node上运行
  3. kube-controller-manager:管理集群的各种资源,使其处于一个预期的状态
  4. etcd: 相当于数据库,保存着节点的各种配置信息,如:kubectl get po时从etcd中获取到资源信息
  5. pod:flannel为pod分配网络

node: 

  1. kubelet:node的agent,当pod被调度到某个node上运行的时候,node将该节点的配置信息发送给kubelet,kubelet依据这些配置信息创建和运行容器
  2. kube-porxy:外界通过访问service访问pod,service收到的请求由proxy完成,proxy还可以实现k8s集群的负载均衡
  3. pod:flannel为pod分配网络

搭建过程

要求:cpu,memory最低2c4g

1.关闭防火墙(所有节点)

  1. systemctl stop firewalld
  2. systemctl disable firewalld
  3. setenforce 0
  4. sed -i "s/enforcing/disabled/g" /etc/selinux/config

2.域名解析(所有节点)

  1. vim /etc/hosts
  2. 192.168.31.11 hp1
  3. 192.168.31.12 hp2
  4. 192.168.31.13 hp3
  5. 192.168.31.14 hp4
echo "1" > /proc/sys/net/bridge/bridge--nf-call-iptables

使用scp命令发送到其他节点

  1. scp /etc/hosts 192.168.31.12:/etc/hosts
  2. scp /etc/hosts 192.168.31.13:/etc/hosts
  3. scp /etc/hosts 192.168.31.14:/etc/hosts

3.关闭交换分区(所有节点)

vim /etc/fstab

swapoff -a
free -h

检查是否已没有swap交换分区

4.配置docker源,docker加速器(阿里云官网,镜像服务,加速器),下载docker-ce(所有节点)

wget -O  /etc/yum.repos.d/docker-ce.repo  https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. yum clean all && yum makecache && yum install docker-ce -y
  2. systemctl restart docker && systemctl enable docker

5.配置k8s源,下载k8s组件,kubectl、kubeadm、kubelet(所有节点)

  1. [kubernetes]
  2. name=Kubernetes
  3. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
  4. enabled=1
  5. gpgcheck=1
  6. repo_gpgcheck=1
  7. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
yum clena all && yum makecache && yum install kubectl-1.15.2 kubelet-1.15.2 kubeadm-1.15.2 -y

注:此处下载时可根据自行情况下载版本

6.启动kubelet(所有节点)

systemctl restart kubelet && systemctl enable kubelet

7.在master节点初始化集群

kubeadm init --apiserver-advertise-address 192.168.31.11 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.15.2 --pod-network-cidr 10.244.0.0/16 --service-cidr 10.96.0.0/12

--image-repository:这个用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers

--kubernetes-version:指定kubenets版本号,默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,我们可以将其指定为固定版本(最新版:v1.13.2)来跳过网络请求。

--apiserver-advertise-address:指明用 Master的哪个interface与Cluster的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm会自动选择有默认网关的interface。


--pod-network-cidr:指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 --pod-network-cidr有自己的要求,这里设置为10.244.0.0/16 是因为我们将使用flannel网络方案,必须设置成这个 CIDR。

 8.复制方框内的内容挨个执行即可,kubeadm join部分为加入从节点加入使用,默认有效期为24小时

9.为pod分配flannel网络

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

 出现上图报错,原因:dns服务器没有找到raw.githubusercontent.com的ip地址

解决方法:

方法一:

IP/服务器raw.githubusercontent.com的信息 - 站长工具 (chinaz.com)中解析地址

 编辑/etc/hosts文件

vim /etc/hosts

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

 方法二:直接vim flannel.yaml

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

10.在主节点复制kubeadm join ***到从节点加入

 11.在主节点运行命令

kubectl get no -o wide 

 notready为节点在拉取镜像,等待完成即可

若长时间未完成大概率为po中前两个镜像拉取失败

原因1:flannel拉取失败导致

原因2:没有做域名解析

原因3:镜像两个镜像拉取失败

解决办法1:做域名解析后重新拉取,或直接写入flannely.yaml文件

解决办法2:编辑/etc/hosts对节点做域名解析

解决办法3:手动导入镜像


补充:

1.kubeadm join信息没有保存或过期如何加入?

  1. systemctl stop kubelet
  2. rm -rf /etc/kubernetes/*
  3. kubeadm token create -ttl0 -print-join-command

2.删除node节点

  1. kubectl drain 节点名 --delete-local-date --force --ignore-daemonsets
  2. kubectl delete no 节点名

3.启动pod(命令行模式)

  1. kubectl run deploy名 --image=镜像名 --replicas=pod数量
  2. kubectl run deploy名 --image=镜像名 -r pod数量

 

imagePullPolicy:(镜像拉取规则)

IfNotPresent:本地镜像仓库没有去dockerhub拉取

Always:无论本地有没有镜像,都去dockerhub拉取

Never:本地仓库没有镜像不去dockerhub拉取,容器启动失败

4.删除pod

  1. kubectl delete deploy deploy名(命令行)
  2. kubectl delete -f *.yml

5.对node打标签,删除标签

  1. kubectl label no 节点名 标签
  2. kubectl label no hp2 disktype=ssd
  3. kubectl label no 节点名 标签-
  4. kubectl label no hp2 disktype-

6.标签使用,可以使yml文件中创建的pod到某个node上运行

7.pod的创建过程:

用户通过kubectl或者是yml文件指定创建n个pod

kube-apiserver会通知deploy

deploy通知rs去创建pod

pod被调度,node节点通过kubelet创建运行容器

应用及配置信息存储在etcd中

flannel为每个pod分配网络

service创建后可外界访问

8.pod的生命周期:pod被创建,pod被调度,pod一旦被分配到node上就不会离开node,除非被删除

9.滚动更新

  1. kubectl create deploy deploy名 --image=镜像名 --dry-run -o yaml > *.yml
  2. kubectl create deploy nginx --image=nginx --dry-run -o yaml > *.yml
  3. kubectl apply -f *.yml --record
  4. kubectl rollout history deploy名
  5. kubectl rollout undo deploy deploy名 --to-revision=

10.pod的动态伸缩

  1. kubectl run deploy名 --image=镜像名 --replicas=pod数量
  2. kubectl run deploy名 --image=镜像名 -r pod数量
  3. kubectl scale --replicas pod数量 deploy deploy名

yml文件动态收缩只需要修改replicas后面的值,重新kubectl apply -f *.yml即可

11.job和crontab启动为Never和OnFailure

12.secret和configmap

 

13.k8s的数据卷:emptyDir、hostpath、nfs、pvpvc

14.探针

Liveness 探测让用户可以自定义判断容器是否健康的条件。如果探测失败,Kubernetes 就会重启容器。

 

启动进程首先创建文件/tmp/healthy,30秒后删除,在我们的设定中,如果/tmp/healthy文件存在,则认为容器处于正常状态,反则发生故障。
livenessProbe 部分定义如何执行Liveness探测:
探测的方法是:通过cat命令检查/tmp/healthy文件是否存在。如果命令执行成功,返回值为零,Kubernetes则认为本次Liveness探测成功;如果命令返回值非零,本次Liveness探测失败。
initialDelaySeconds: 10 指定容器启动10秒之后开始执行Liveness探测,我们一般会根据应用启动的准备时间来设置。比如某个应用正常启动要花30秒,那么initialDelaySeconds的值就应该大于30。
periodSeconds: 5指定每5秒执行一次Liveness探测。Kubernetes如果连续执行3次Liveness探测均失败,则会杀掉并重启容器。

Readiness:用户通过Liveness探测可以告诉Kubernetes什么时候通过重启容器实现自愈;Readiness探测则是告诉Kubernetes什么时候可以将容器加入到Service负载均衡池中,对外提供服务。
 

 Liveness探测和Readiness探测做个比较:
(1)Liveness探测和Readiness探测是两种Health Check机制,如果不特意配置,Kubernetes将对两种探测采取相同的默认行为,即通过判断容器启动进程的返回值是否为零来判断探测是否成功。
(2)两种探测的配置方法完全一样,支持的配置参数也一样。不同之处在于探测失败后的行为:Liveness探测是重启容器;Readiness探测则是将容器设置为不可用,不接收Service转发的请求。
(3)Liveness探测和Readiness探测是独立执行的,二者之间没有依赖,所以可以单独使用,也可以同时使用。用Liveness探测判断容器是否需要重启以实现自愈;用Readiness探测判断容器是否已经准备好对外提供服务。
 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号