目录
K8S的Pod资源
资源清单写法
http://k8s.driverzeng.com/v1.19/
K8S命令
选项 | 作用 |
---|---|
-n | 指定名称空间 |
-f | 指定资源清单 |
-o | 指定输出格式 |
-c | 指定连接 POD 中的容器 |
-w | 动态查看,在查看日志或详细信息时 |
查看
1)查看资源
kubectl get 资源名
kubectl get namespace // 列出所有的命名空间
kubectl get ns
kubectl get pod // 查看默认命名空间下的资源
kubectl get pod -n my-namespace // -n 查看指定的命名空间
kubectl get pod -l app=my-app // -l 查看指定标签
kubectl get node // 查看所有节点信息
kubectl get node -l environment=production // 查看具有这个标签的节点
kubectl get node -o wide // 显示节点详细信息
kubectl get deployments // 查看手动启动的容器
2) 查看pod指定格式信息
[root@master-1 ~]# kubectl get pod -o wide // Pod 的广泛信息,包括名称、状态、IP 地址、节点、所属命名空间等
[root@master-1 ~]# kubectl get pod -o name // 只显示 Pod 的名称
[root@master-1 ~]# kubectl get pod -o json // 以 JSON 格式显示所有 Pod 的详细信息
[root@master-1 ~]# kubectl get pod -o yaml // 以 YAML 格式显示所有 Pod 的详细信息
5)查看资源相信信息(排错)
kubectl describe 资源名
kubectl describe pod nginx-565785f75c-pqtxf // 查看默认命名空间下的具体的这个资源的详细信息
6)查看日志
kubectl logs pod pod名字
kubectl logs nginx-565785f75c-pqtxf // 查看默认pod下的资源日志
kubectl logs -n he nginx // 查看he这个命名空间下的nginx资源的日志
kubectl logs -n he -f nginx // -f 实时查看
创建
2)创建资源
kubectl create 资源名
kubectl create ns 名称空间名字
# 手动创建一个pod名叫nginx镜像为nginx:alpine
[root@master-1 ~]# kubectl create deployment nginx --image=nginx:alpine
# 创建一个名为 nginx10 的 Deployment,其中包含 10 个副本,并使用 nginx:alpine 镜像
[root@master-1 ~]# kubectl create deployment nginx10 --image=nginx:alpine --replicas=10
kubectl run
kubectl exec -it pod名字 /bin/bash // 登录容器
[root@master-1 ~]# kubectl exec -it nginx2 -- /bin/sh
[root@master-1 ~]# kubectl exec -it nginx -c nginx1 -- /bin/sh
## 登录资源清单里不同的资源
kubectl exec -it pod -n wordpress wordpress-f5f9f7c97-f727h /bin/sh
标签
3)给资源打标签
kubectl label 资源名
kubectl label pod key=value
kubectl label node key=value
# 查看标签
kubectl get pod -n zls --show-labels
## 打标签(node)
[root@master-1 ~]# kubectl label node node-1 CPU=Xeon
## 打标签(pod)
[root@master-1 ~]# kubectl label pod nginx MEM=Kinston
## 删除标签
[root@master-1 ~]# kubectl label pod nginx MEM-
删除
4)删除资源
kubectl delete 资源名
kubectl delete ns 名称空间
# 删除不在从新拉起
kubectl delete -f /tmp/yyy.yaml // 资源清单拉启的服务
kubectl delete deployments.apps nginx1 // 手动拉起的服务
pod沉浸式体验
[root@master-1 ~]# kubectl create deployment nginx --image=nginx:alpine
[root@master-1 ~]# kubectl create deployment nginx10 --image=nginx:alpine --replicas=10
## 查看pod指定格式信息
[root@master-1 ~]# kubectl get pod -o wide
[root@master-1 ~]# kubectl get pod -o name
[root@master-1 ~]# kubectl get pod -o json
[root@master-1 ~]# kubectl get pod -o yaml
[root@master-1 ~]# kubectl get pod nginx-565785f75c-7q7mw -o yaml
## 使用资源清单启动pod
[root@master-1 ~]# vim test_nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-test
namespace: default
spec:
containers:
- image: nginx:alpine
imagePullPolicy: IfNotPresent
name: nginx-test
imagePullPolicy:镜像拉取策略:
Always:总是拉取镜像 nginx:latest
Never:永远不拉镜像
IfNotPresent:如果镜像在机器上不存在,则拉,否则不拉
## 如果配置发生变化,可以自动更新
[root@master-1 ~]# kubectl apply -f suibian.yaml
## 第二次运行,会报错,因为已经创建过了
[root@master-1 ~]# kubectl create -f suibian.yaml
apiVersion: "v1" // 接口
kind: "Pod" // 资源类型
metadata: // 资源元数据定义
name: nginx-pod // pod名字
namespace: zls // 给pod启动在哪个名称空间
labels: // 打标签
hht: 1cm // 标签名 key:value
spec: // 定义pod中容器的内容
containers: // 容器内容
- image: nginx:1.20.2 // 指定镜像名
imagePullPolicy: IfNotPresent // 镜像拉取规则
name: nginx-container // 容器名
## 一个pod中启动多个容器
apiVersion : "v1"
kind : "Namespace"
metadata:
name: zls
---
apiVersion: "v1"
kind: "Pod"
metadata:
name: nginx-pod
namespace: zls
labels:
hht: 1cm
spec:
containers:
- name: nginx-container
image: nginx:1.20.2
imagePullPolicy: IfNotPresent
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
command: ['/bin/tail','-f','/etc/hosts']
#command:
#- tail
#- -f
#- /etc/hosts
k8s标签使用
## 查看标签
[root@master-1 ~]# kubectl get pod -n he --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 62m <none>
## 打标签(node)
[root@master-1 ~]# kubectl label node node-1 CPU=Xeon
## 打标签(pod)
[root@master-1 ~]# kubectl label pod -n he nginx cpu=Xeon
pod/nginx labeled
[root@master-1 ~]# kubectl get pod -n he --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 66m cpu=Xeon
# 打多个标签
[root@master-1 ~]# kubectl label pod -n he nginx app=nginx
pod/nginx labeled
[root@master-1 ~]# kubectl get pod -n he --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 68m app=nginx,cpu=Xeon
# 默认命名空间下的,打标签
[root@master-1 ~]# kubectl label pod nginx MEM=Kinston
## 使用资源清单打标签
metadata:
labels:
hht: 1cm
## 删除标签
[root@master-1 ~]# kubectl label pod nginx MEM-
## 根据标签找pod
[root@master-1 ~]# kubectl get pod -l app=nginx
NAME READY STATUS RESTARTS AGE
nginx-565785f75c-pqtxf 1/1 Running 0 62m
## 根据标签删除
kubectl delete pod -l app=nginx2
重新认识POD
共享网络
POD内的容器使用Container模式共享根容器的网络
容器看到的网络设备信息和根容器完全相同
POD内的多个容器可以使用localhost进行网络通讯
POD内的多个容器不能绑定相同的端口
POD的生命周期和根容器一样,如果根容器退出了,POD就退出了
# 测试一个pod中运行两个容器
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- image: nginx
ports:
- name: nginx1
containerPort: 80
imagePullPolicy: IfNotPresent
containers:
- image: nginx
ports:
- name: nginx2
containerPort: 8080
imagePullPolicy: IfNotPresent
## 指定pod启动在某个节点上
spec:
nodeName: node-1 // 根据node名,启动pod (二选一,俩都放上去就是,和)
nodeSelector: // 根据node标签,启动pod
CPU: Xeon
containers:
- name: nginx-container
image: nginx:alpine
imagePullPolicy: IfNotPresent
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
command: ['/bin/tail','-f','/etc/hosts']
共享存储(挂载)
默认情况下一个POD内的容器文件系统是互相隔离的
如果想让一个POD容器共享文件那么只需要定义一个Volume,然后两个容器分别挂载到这个Volume中
hostPath:将容器中的目录挂载到宿主上指定的目录
emptyDir:在宿主机找个临时目录挂载,只为容器之间共享存储,无法数据持久化
## hostPath
apiVersion: "v1"
kind: "Pod"
metadata:
name: nginx-pod
labels:
hht: 1cm
spec:
volumes:
- name: guazaidian
hostPath:
path: /data/test
- name: dierguazaidian
hostPath:
path: /data/test2
containers:
- name: nginx-container
image: nginx:alpine
imagePullPolicy: IfNotPresent
volumeMounts:
- name: guazaidian
mountPath: /var/log/nginx/
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
command: ['/bin/tail','-f','/etc/hosts']
volumeMounts:
- name: guazaidian
mountPath: /opt/test/
## emptyDir
apiVersion: "v1"
kind: "Pod"
metadata:
name: nginx-pod
labels:
hht: 1cm
spec:
volumes:
- name: guazaidian
hostPath:
path: /data/test
- name: dierguazaidian
emptyDir: {}
containers:
- name: nginx-container
image: nginx:alpine
imagePullPolicy: IfNotPresent
volumeMounts:
- name: dierguazaidian
mountPath: /var/log/nginx/
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
command: ['/bin/tail','-f','/etc/hosts']
volumeMounts:
- name: dierguazaidian
mountPath: /opt/test/
作业:
1)写一个启动MySQL资源清单
env -e
指定字符集,校验规则
2)wordpress
3)coreDNS
Pod对容器的封装和应用
第一种:全部放一个pod里
第二种:Wordpress和MySQL分开
那么如何扩容呢?如果第一种方案大家会发现没有办法很好的扩容,因为数据库和wordpress已经绑定成一个整体了,扩容wordpress就得扩容mysql。而第二种方案就要灵活的多。
POD的生命周期
initContainers 初始化容器
初始化容器是指,在主容器启动之前,我们可以让他做一些准备工作。
比如:
1.两个容器做了共享存储,那么我们可以让它先启动一个容器,来对目录进行更改用户和授权
2.容器需要连接数据库,那么可以让初始化容器检测数据库是否可以正常连接,如果可以再启动主容器
[root@master-1 nginx]# cat nginx.yaml
apiVersion: "v1"
kind: "Pod"
metadata:
name: nginx-67
spec:
volumes:
- name: guazai
emptyDir: {}
initContainers:
- name: ches
image: nginx:alpine
imagePullPolicy: IfNotPresent
args: ["/bin/sh", "-c", "echo k8s >> /usr/share/nginx/html/index.html"]
volumeMounts:
- name: guazai
mountPath: /usr/share/nginx/html
containers:
- name: nginx-fw
image: nginx:alpine
imagePullPolicy: IfNotPresent
volumeMounts:
- name: guazai
mountPath: /usr/share/nginx/html
hook 钩子
# 钩子位置
cpec > containers > lifecycle
PostStart:在容器启动创建后,立即执行,但时间不能太长,否则容器不会是running状态
exec:执行命令
httpGet:检测http
tcpSocket:检测端口
[root@master-1 nginx]# cat hook.yaml
apiVersion: v1
kind: Pod
metadata:
name: myhook
spec:
containers:
- name: myhook01
image: nginx:alpine
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command:
- "/bin/sh"
- "-c"
- "echo k8s postStart > /usr/share/nginx/html/index.html"
PreStop:在容器停止前,执行一些命令,主要用于优雅关闭程序
exec:执行命令
httpGet:检测http
tcpSocket:检测端口
[root@master-1 nginx]# cat hook2.yaml
apiVersion: v1
kind: Pod
metadata:
name: myhook02
spec:
volumes:
- name: test
hostPath:
path: /data/nginx
containers:
- name: myhook02
image: nginx:alpine
imagePullPolicy: IfNotPresent
volumeMounts:
- name: test
mountPath: /usr/share/nginx/html/
lifecycle:
postStart:
exec:
command:
- "/bin/sh"
- "-c"
- "echo k8s postStart > /usr/share/nginx/html/index.html"
preStop:
exec:
command:
- "/bin/sh"
- "-c"
- "echo bye > /usr/share/nginx/html/1.txt"
健康检查探针
# 探针位置
cpec > containers > livenessProbe
# 存活态探针(存活性探针):检测pod中容器的应用是否存活
exec:执行命令检测
httpGet:检测http
tcpSocket:检测端口
## exec
[root@master-1 nginx]# cat tan.yaml
apiVersion: v1
kind: Pod
metadata:
name: liveness
labels:
name: liveness
spec:
volumes:
- name: test
hostPath:
path: /data/test
containers:
- name: liveness
image: nginx:alpine
imagePullPolicy: IfNotPresent
volumeMounts:
- name: test
mountPath: /usr/share/nginx/html/
lifecycle:
postStart:
exec:
command:
- "/bin/sh"
- "-c"
- "echo test liveness > /usr/share/nginx/html/index.html"
livenessProbe:
exec:
command:
- "/bin/sh"
- "-c"
- "cat /usr/share/nginx/html/index.html"
initialDelaySeconds: 3
periodSeconds: 1
## httpget
[root@master-1 nginx]# cat tan02.yaml
apiVersion: v1
kind: Pod
metadata:
name: liveness
labels:
name: liveness
spec:
volumes:
- name: test
hostPath:
path: /data/test
containers:
- name: liveness
image: nginx:alpine
imagePullPolicy: IfNotPresent
volumeMounts:
- name: test
mountPath: /usr/share/nginx/html/
lifecycle:
postStart:
exec:
command:
- "/bin/sh"
- "-c"
- "echo test liveness > /usr/share/nginx/html/index.html"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 3
periodSeconds: 1
就绪态探针
# 位置
cpec > containers > lifecycle
# 就绪态探针(就绪性探针):检测pod内容器应用是否都准备就绪,如果没有准备就绪,就不对外提供
服务(不开放流量)
exec:执行命令检测
httpGet:检测http
tcpSocket:检测端口
readinessProbe
initialDelaySeconds: 第一次执行探针需要在容器启动后等待的时候时间
periodSeconds: 容器启动后每隔多少秒执行一次存活探针
timeoutSeconds: 探针超时时间,默认1秒,最小1秒
successThreshold: 探针失败后最少连续探测成功多少次才被认定成功,默认1次,如果是liveness必须为1
failureThreshold: 探针成功后被视为失败的探测的最小连续失败次数。默认3次。最小值为1
# exec
[root@master-1 nginx]# cat hook.yaml
apiVersion: v1
kind: Pod
metadata:
name: myhook
spec:
containers:
- name: myhook01
image: nginx:alpine
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command:
- "/bin/sh"
- "-c"
- "echo k8s postStart > /usr/share/nginx/html/index.html"
readinessProbe:
exec:
command:
- "ls"
- "/root"
initialDelaySeconds: 1
periodSeconds: 1
timeoutSeconds: 1
successThreshold: 1
failureThreshold: 1
# http
[root@master-1 nginx]# cat hook.yaml
apiVersion: v1
kind: Pod
metadata:
name: myhook
spec:
containers:
- name: myhook01
image: nginx:alpine
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command:
- "/bin/sh"
- "-c"
- "echo k8s postStart > /usr/share/nginx/html/index.html"
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 1
periodSeconds: 1
timeoutSeconds: 1
successThreshold: 1
failureThreshold: 1
存活态探针测试(健康检查探针)
连接
# 删除配置文件
root@wordpress-7897cdc46d-wm6mc:/var/www/html# rm -fr wp-config.php
过后会自动拉起
clusterIP
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
# 启动
kubectl apply -f service.yaml
# 查看
kubectl get service <service-name>
## 代码翻译
apiVersion: v1:指定 Kubernetes API 的版本为 v1。
kind: Service:指定要创建的资源类型为 Service。
metadata.name: my-service:指定该服务的名称为 "my-service"。
spec.selector.app: my-app:通过标签选择器指定将流量路由到带有标签 app: my-app 的 Pod 上。
spec.ports:指定要在服务上监听的端口和目标端口。
protocol: TCP:指定使用 TCP 协议进行通信。
port: 80:将服务暴露在集群内部的 80 端口上。
targetPort: 8080:将流量转发到后端 Pod 上的 8080 端口。
type: ClusterIP:指定服务的类型为 ClusterIP,这意味着服务只能在集群内部访问。
在pod前加一个clusterIP
[root@master-1 opt]# kubectl expose pod liveness-pod --port=80 --target-port=80 --type=ClusterIP
POD资源限制
apiVersion: v1
kind: Pod
metadata:
name: resource-demo
spec:
containers:
- name: resource-demo
image: nginx
ports:
- containerPort: 80
resources:
requests:
memory: 50Mi
cpu: 1500m
limits:
memory: 100Mi
cpu: 200m
参数解释:
requests :节点所需的最小计算资源量,k8s调度的时候的依据值
limits :限制允许的最大计算资源量,真正的资源限制参数
数值的转换:
1 CPU = 1000m
0.5 CPU = 500m
1 Mib = 1024 Kib
1 MB = 1000 KB
# 宿主机上位置
/sys/fs/cgroup/cpu/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podd29f3eee_bf6a_4747_b3bf_c6f2bd5bf561.slice
标签:kubectl,name,nginx,命令,master,Pod,K8S,root,pod
From: https://www.cnblogs.com/xiutai/p/17749237.html