2、Pod常用操作

1、pause

基础设施容器。为了实现pod内部可以通过localhost通信,每个pod都会启动Infra容器,然后pod内部的其他容器间会共享该容器的网络空间(docker的container模式),此容器只需要维持着网络空间,所以资源消耗很低。

2、查看pod详细信息命令

kubectl get pod -o wide# 查看pod调度的节点及pod ip等信息
kubectl get pod myblog -o yaml|json # 查看完整yaml|json
kubectl describe pod myblog  # 查看pod明细信息及事件

kubectl -n test exec -it  podName [-c containerName] /bin/sh# 进入容器
kubectl -n test logs -f   podName [-c containerName]  # 查看日志
kubectl -n test logs -f --tail=111   podName [-c containerName] 

3、pod数据持久化

hostPath

定点hostPath挂载,nodeSelector定点

kubectl get nodes –show-labels # 查看labels

kubectl label node nodeName xx=yy # 给节点打标签

apiVersion: v1
kind: Pod
metadata:
  name: myblog
  namespace: test
  labels:
    component: myblog
spec:
  volumes: # 本地挂载目录
  - name: mysql-data
     hostPath:
       path: /opt/mysql/data
  nodeSelector:  # 选择节点挂载
    component: mysql
  containers:
  - name: myblog
     image: myblog:v1
     env:
     - name: MYSQL_HOST
        value: '127.0.0.1'
     - name: MYSQL_PASSWD
        value: '123456'
     ports:
     - containerPort: 8002
  - name: mysql
     image: mysql:5.7-utf8
     ports:
     - containerPort: 3306
     env:
     - name: MYSQL_ROOT_PASSWORD
        value: '123456'
     - name: MYSQL_DATABASE
        value: 'myblog'
     volumeMounts: # 使用挂载
     - name: mysql-data
        mountPath: /var/lib/mysql

pv+pvc(待学习)

实现分布式存储。

ceph

glusterfs

nfs

4、服务健康检查

检测容器服务是否健康,不健康会根据重启策略进行操作,2种机制可以分别单独设置。

LivenessProbe探针

存活性探测:判断容器是否存活,即状态是否为running状态。如果状态不健康,kubelet就会kill容器,并根据重启策略是否重启,如果不包含探针,kubelet认为容器探针返回值永远成功。

...
containers:
- name: myblog
   image: mysql:5.1
   livenessProbe:
     httpGet:
       path: /blog/index/
       port: 8002
       schema: HTTP
     initialDelaySeconds: 10 # 容器启动后第一次执行探测需要等待多久
     periodSeconds: 10  # 执行探测的频率
     timeoutSeconds: 2 # 探测超时时间
...

ReadnessProbe探针

可用性探测:判断容器是否正常提供服务。判断容器Ready(1/2)是否为true,为false的话,endpoint controller控制器将此pod的endpoint从对应的svc的endpoint列表中移除,不再将任何请求调度到此pod上,直到下次探测成功。

...
containers:
- name: myblog
  image: myblog:v1
  readnessProbe:
    httpGet:
      path: /blog/index/
      port: 8002
      scheme: HTTP
    initialDelaySeconds: 10
    timeoutSeconds: 2
    periodSeconds: 10
...

探测命令

  • exec 通过执行命令来检查服务是否正常,返回为0表示容器健康
  • httpGet 通过发送http请求检查是否正常,返回200-399表示容器健康
  • tcpSocket 通过容器ip和port执行TCP检查,如果可以建立tcp连接,表示容器健康

其他参数

参数 说明
periodSeconds 执行探测频率,默认10s,最小1s
initialDelaySeconds 容器启动后第一次执行探测时需要等待多少秒
timeoutSeconds 探测超时时间,默认1s,最小1s
successThreshold 探测失败后,最少连续探测成功多少次才被认定为成功
periodSeconds 探测成功后,最少连续探测失败多少次才被认定为失败

5、重启策略

  • Never

无论容器运行状态如何,kubelet都不会重启容器。

  • Always 默认

当容器进程退出后,由kebelet自动重启该容器。

  • Onfailure

当容器终止运行且退出代码不为0时,由kebelet自动重启该容器。

apiVersion: v1
kind: Pod
metadata:
	name: test-restart-policy
spec:
	restartPolicy: Always
	containers:
	- name: busybox
		image: busybox
		args:
		- /bin/sh
		- -c
		- sleep 10 && exit 1

6、镜像拉取策略

spec:
	containers:
	- name: myblog
		image:myblog
		imagePullPolicy: IfNotPresent
  • Always 总是从远程仓库拉取
  • IfNotPresent 本地有使用本地,本地没有拉取远程仓库
  • Never 只使用本地镜像,没有报错

7、资源限制

基础资源:cpu和内存

k8s采用requests和limits两种类型参数对资源进行预分配和使用限制。

...
containers:
- name: myblog
  image: myblog:v1
  env:
  - name: MYSQL_HOST
     value: '127.0.0.1'
  ports:
  - containerPort: 8002
  resources:
    requests:
      memory: 100Mi
      cpu: 50m
    limit:
      memory: 500Mi
      cpu: 100m
...

requests

  • 容器使用最小资源的需求,作用于scheduler阶段,作为容器调度时资源分配的判断
  • 只有当前节点可分配的资源量>=request时才允许将pod调度到此节点
  • request参数不限制容器的最大可使用资源
  • request.cpu被转换为docker的–cpu-share参数,与cgroup cpu.shares功能相同
  • request.memory没有对应的docker参数,仅作为k8s调度依据

limits

  • 容器能使用的资源最大值
  • 设置为0,资源可无限使用
  • pod内存超过limit,会被oom(内存溢出)
  • cpu超过limit,不会被kill,但是会限制不超过limit值
  • limits.cpu会被转换为docker的-cpu-quato
  • limits.memory会被转换为docker的-memory参数,限制容器使用最大内存

1 core = 1000m

8、yaml优化

查看代码
  
apiVersion: v1
kind: Pod
metadata:
	name: myblog
	namespace: test
	labels:
		component: myblog
spec:
	volumes:
	- name: mysql-data
		hostPath:
			path: /opt/mysql/data
	nodeSelector: # 使用节点选择器将pod调度到指定label的节点
		component: mysql
	containers:
	- name: myblog
	  image: 172.21.51.67:5000/myblog
	  env:
	  - name: MYSQL_HOST
	  	value: '127.0.0.1'
	  - name: MYSQL_PASSWD
	    value: '123456'
	  ports:
	  - containerPort: 8002
	  resources:
	    requests:
	      memory: 100Mi
	      cpu: 50m
	    limits:
	      memory: 500Mi
	      cpu: 100m
	  livenessProbe:
	    httpGet:
	      path: /blog/index/
	      port: 8002
	      scheme: HTTP
	    initialDelaySeconds: 10
	    periodSeconds: 15
	    timeoutSeconds: 2
	  readnessProbe:
	  	httpGet:
	  		path: /blog/index/
	  		port: 8002
	  		scheme: HTTP
	    initialDelaySeconds: 10
	    periodSeconds: 15
	    timeoutSeconds: 2
	- name: mysql
    image: 172.21.51.67:5000/mysql:5.7-utf8
    ports:
    - containerPort: 3306
    env:
    - name: MYSQL_ROOT_PASSWORD
	  	value: '123456'
	  - name: MYSQL_DATABASE
	    value: 'myblog'
	  resources:
	    requests:
	      memory: 100Mi
	      cpu: 50m
	    limits:
	      memory: 500Mi
	      cpu: 100m
	  livenessProbe:
	    tcpSocket:
	      port: 3306
	    initialDelaySeconds: 5
	    periodSeconds: 10
	  readnessProbe:
	  	tcpSocket:
	  		port: 3306
	    initialDelaySeconds: 5
	    periodSeconds: 10
	  volumeMounts:
	  - name: mysql-data
	    mountPath: /var/lib/mysql
  

**为什么优化?**

1、中间件作为公共资源,需要拆分开。但是myblog调用mysql的ip地址发生了变化,可以将mysql固定到宿主机的NodePort上(因为磁盘挂载在指定机器上),使用hostNetwork。

mysql.yaml

查看代码
  
apiVersion: v1
Kind: Pod
metadata:
	name: mysql
	namespace: test
	labels:
		component: mysql
spec:
	hostNetwork: true # 容器占什么端口,就起什么端口
	volumes:
	- name: mysql-data
		hostPath:
			path: /opt/mysql/data
	nodeSelector: # 使用节点选择器将pod调度到指定label的节点
		component: mysql
	containers:
	- name: mysql
    image: 172.21.51.67:5000/mysql:5.7-utf8
    ports:
    - containerPort: 3306
    env:
    - name: MYSQL_ROOT_PASSWORD
	  	value: '123456'
	  - name: MYSQL_DATABASE
	    value: 'myblog'
	  resources:
	    requests:
	      memory: 100Mi
	      cpu: 50m
	    limits:
	      memory: 500Mi
	      cpu: 100m
	  livenessProbe:
	    tcpSocket:
	      port: 3306
	    initialDelaySeconds: 5
	    periodSeconds: 10
	  readnessProbe:
	  	tcpSocket:
	  		port: 3306
	    initialDelaySeconds: 5
	    periodSeconds: 10
	  volumeMounts:
	  - name: mysql-data
	    mountPath: /var/lib/mysql
  

**myblog.yaml**

查看代码
  
apiVersion: v1
kind: Pod
metadata:
	name: myblog
	namespace: test
	labels:
		component: myblog
spec:
	containers:
	- name: myblog
	  image: 172.21.51.67:5000/myblog
	  imagePullPolicy: IfNotPresent
	  env:
	  - name: MYSQL_HOST
	  	value: 'Node IP' # 使用数据库Node IP
	  - name: MYSQL_PASSWD
	    value: '123456'
	  ports:
	  - containerPort: 8002
	  resources:
	    requests:
	      memory: 100Mi
	      cpu: 50m
	    limits:
	      memory: 500Mi
	      cpu: 100m
	  livenessProbe:
	    httpGet:
	      path: /blog/index/
	      port: 8002
	      scheme: HTTP
	    initialDelaySeconds: 10
	    periodSeconds: 15
	    timeoutSeconds: 2
	  readnessProbe:
	  	httpGet:
	  		path: /blog/index/
	  		port: 8002
	  		scheme: HTTP
	    initialDelaySeconds: 10
	    periodSeconds: 15
	    timeoutSeconds: 2
  

2、环境变量,敏感信息,安全隐患,使用secret和ConfigMap,实现业务配置统一管理。镜像和配置文件分离开,提高可移植性。

configmap可以管理配置文件或环节变量

configmap

apiVersion: v1
kind: ConfigMap
metadata:
  name: myblog
  namespace: test
data:
  MYSQL_HOST: '192.168.1.1'
  MYSQL_PORT:	'3306'
	
# 或者使用命令创建,从文件中创建
kubectl create configmap mysql-cm --from-env-file=configmap.txt
env:
- name: HostName
  valueFrom:
    configMapKeyRef:
      name: mysql-cm # cmName
      key: MYSQL_HOST
- name: Password
   valueFrom:
     configMapKeyRef:
       name: mysql-cm
       key: MYSQL_PORT

Secret

管理敏感类信息,默认使用base64编码存储,有3种类型:

  • Service Account(sa) 用来访问k8s api,由k8s自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中,创建sa后,pod中指定sa,自动创建该sa的Secret。
  • Opaque base64编码格式的secret,用来存储密码和密钥文件。
  • kubernetes.io/dockerconfigjson 用来存储私有docker registry的认证信息
apiVersion: v1
kind: Secret
metadata:
  name: secret-test
  namespace: test
type: Opaque
data:
  MYSQL_USER: cm9vdA==  # echo -n  root |base64
  MYSQL_PASSWD: MTIzNDU2
# 手动创建secret
cat secret.txt
MYSQL_USER=root
MYSQL_PASSWD=123456

kubectl create secret generic myblog --from-env-file=secret.txt

使用secret

env:
- name: MYSQL_USER
   valueFrom:
     secretKeyRef:
       name: myblog
       key: MYSQL_USER
- name: MYSQL_ROOT_PASSWORD
   valueFrom:
     secretKeyRef:
       name:  myblog
       key:  MYSQL_PASSWD
- name: MYSQL_DATABASE
   value: 'myblog'

9、pod状态和生命周期

状态

Pending				API Server已经创建该Pod,等待调度器调度
ContainerCreating	 拉取镜像启动容器中
Running				Pod内 容器已经创建,且至少有一个容器处于运行状态、正在启动状态或正在重启状态
Succeeded|Completed	 Pod内所有容器均已成功执行退出,且不再重启
Failed|Error		 Pod内所有容器均已退出,但至少有一个处于退出失败状态
CrashLoopBackOff	 Pod内容器启动失败,比如配置文件丢失导致主进程启动失败
Unknown			    由于某种原因无法获取Pod状态,可能由于网络通信不畅

生命周期


initContainer(初始化容器)->创建MainContainer过程(创建前hook->livenessProbe->ReadnessProbe->创建完成后hook)

初始化容器功能:

  • 验证业务应用依赖的组件是否均已启动
  • 修改目录的权限
  • 调整系统参数

原文地址:http://www.cnblogs.com/20190707wdd/p/16876176.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性