首页 > 其他分享 >Pod常用操作

Pod常用操作

时间:2022-11-10 13:57:07浏览次数:41  
标签:容器 常用 name myblog MYSQL mysql 操作 Pod pod

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)

初始化容器功能:

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

标签:容器,常用,name,myblog,MYSQL,mysql,操作,Pod,pod
From: https://www.cnblogs.com/20190707wdd/p/16876176.html

相关文章

  • Python实验报告(基本文件操作)
    1.创建并打开记录蚂蚁庄园动态的文件   结果:       2.向蚂蚁庄园的动态文件写入一条信息  结果:     3.显示蚂蚁庄园的动态 结果:......
  • 学习记录24常用API
    Math\System\Runtime\Object\BigInteger\BigDecima\正则表达式(爬虫、捕获)主要记忆类名和作用MathString时间原点:1970年1月1日08:00:001秒=1000毫秒1毫秒=1000......
  • String常用API
    String常用API1.获取字符串长度intlength=str.length();2.根据索引,返回字符串中对应的字符charc=str.chaeAt(length-1);//可遍历字符串3.检索字符串,返......
  • #littlefs原理分析#[三]fetch操作
    作者:蒋卫峰李涛前言前面的littlefs原理分析文章中,第一篇介绍了littlefs的整体结构,第二篇介绍了littlefs中记录元数据的方式,即commit机制。这一篇(littlefs原理分析:(3)fetch......
  • 数据可视化|常用图表类型汇总
    数据可视化是为了使得数据更高效的反应数据情况,便于让读者更高效阅读,而不单是自己使用,通过数据可视化突出数据背后的规律,以此突出数据中的重要因素,并且,数据可视化可以将数据......
  • pycharm 常用快捷键
    1.debug相关功能    F8:stepover单步遇到断点后,程序停止运行,按F8单步运行。    F7:stepinto进入配合F8使用。单步调试F8时,如果某行调用其他......
  • Collection接口和常用方法2
    方法2:增强for循环:可以代替iterator迭代器特点:增强for就是简化版的iterator,本质一样,只能用于遍历集合或者数组基本语法:for(元素类型元素名:集合名或数组名){......
  • pytorch tensor 张量常用方法介绍
    1. view()函数PyTorch 中的view()函数相当于numpy中的resize()函数,都是用来重构(或者调整)张量维度的,用法稍有不同。>>>importtorch>>>re=torch.tensor([1,......
  • 节点操作
    一、节点概述网页中的所有内容都是节点(标签、属性、文本、注释等),使用node表示。HTML、DOM树中的所有节点均可通过JavaScript进行访问,所有HTML元素(节点)均可被修改,也可......
  • 数据库主从复制方法 以及nginx常用命令汇总
      主从复制可以很好解决一个服务器压力太大的缺点  在实际情况中可以让读一个库 增删查一个库具体步骤由图可知首先主库master会生成二进制日志从库可以开辟一......