k8s使用
一、常用命令
● 获取当前命名空间下的容器
kubectl get po
● 查看某命名空间下的容器
kubectl get pods --namespace=development
● 获取所有容器列表
kubectl get all
● 创建容器
kubectl create -f kubernate-pvc.yaml
● 删除容器
kubectl delete pods/test-pd
kubectl delete -f rc-nginx.yaml
● 删除所有容器
kubectl delete pod --all
● 替换容器
kubectl replace -f mytomcat.rc.yaml
● 查看指定pod跑在哪个node上
kubectl get pod /test-pd -o wide
● 查看容器日志
kubectl logs nginx-8586cf59-mwwtc
● 进入容器终端命令
kubectl exec -it nginx-8586cf59-mwwtc /bin/bash
一个pod里有多个容器时(假如这里有个Pod名为my-pod,这个Pod有两个容器,分别名为main-app 和 helper-app)
kubectl exec -it my-pod --container main-app -- /bin/bash
● 容器详情列表
kubectl describe po mysql-m8rbl
● 查看容器状态
kubectl get svc
● 删除所有服务
kubectl delete svc --all
● 设置RC副本数量
kubectl scale rc nginx --replicas=5
二、yaml核心配置
1.Pod
● 一个容器组成的Pod
apiVersion: v1
kind: Pod
metadata:
name: mytomcat
labels:
name: mytomcat
spec:
containers:
- name: mytomcat
image: 192.168.126.112:5000/docker.io/tomcat
ports:
- containerPort: 8080
● 两个紧密耦合的容器
apiVersion: v1
kind: Pod
metadata:
name: myweb
labels:
name: tomcat-redis
spec:
containers:
- name: tomcat
image: tomcat
ports:
- containerPort: 8080
- name: redis
image: redis
ports:
- containerPort: 6379
● 资源配置(容器申请最少0.25个CPU以及64MiB内存,在运行过程中容器所能使用的资源配额为0.5个 CPU以及128MiB内存)
sepc
containers:
- name: db
image: mysql
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
2.Label(常用在metadata.labels字段)
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
通过spec.selector来引用对象
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: NodePort
ports:
- port: 80
nodePort: 33333
selector:
app: nginx
3.RC
apiVersion: v1
kind: ReplicationController
metadata:
name: mywebapp
spec:
replicas: 1
template:
metadata:
name: mywebapp
labels:
app: mywebapp
spec:
containers:
- name: mywebapp
image: 192.168.126.112:5000/docker.io/tomcat
ports:
- containerPort: 8080
svc
apiVersion: v1
kind: Service
metadata:
name: mywebapp-svc
spec:
ports:
- port: 8081
targetPort: 8080
selector:
app: mywebapp
4.Deployment(为了更好解决Pod编排问题)
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
resources:
requests:
cpu: 50m
ports:
- containerPort: 80
Horizontal Pod Autoscaler,根据Pod的CPU使用率自动扩缩容
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: app/v1beta1
kind: Deployment
name: nginx-deployment
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 50
svc
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
ports:
- port: 80
selector:
app: nginx
5.Volumn(共享目录)
● emptyDir
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: docker.io/nazarpc/webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
● hostPath
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: docker.io/nazarpc/webserver
name: test-container
# 指定在容器中挂接路径
volumeMounts:
- mountPath: /test-pd
name: test-volume
# 指定所提供的存储卷
volumes:
- name: test-volume
# 宿主机上的目录
hostPath:
# directory location on host
path: /data
● nfs
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: redis
spec:
selector:
matchLabels:
app: redis
revisionHistoryLimit: 2
template:
metadata:
labels:
app: redis
spec:
containers:
# 应用的镜像
- image: redis
name: redis
imagePullPolicy: IfNotPresent
# 应用的内部端口
ports:
- containerPort: 6379
name: redis6379
env:
- name: ALLOW_EMPTY_PASSWORD
value: "yes"
- name: REDIS_PASSWORD
value: "redis"
# 持久化挂接位置,在docker中
volumeMounts:
- name: redis-persistent-storage
mountPath: /data
volumes:
# 宿主机上的目录
- name: redis-persistent-storage
nfs:
path: /k8s-nfs/redis/data
server: 192.168.126.112
6.Namespace
apiVersion: v1
kind: Namespace
metadata:
name: development
Pod
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: development
spec:
containers:
- image: busybox
command:
- sleep
- "3600"
name: busybox
7.Service
7.1配置案例
● 多端口Service
apiVersion: v1
kind: Service
metadata:
name: mywebAppService
spec:
ports:
- port: 8080
targetPort: 8080
name: web
- port: 8005
targetPort: 8005
name: management
selector:
app: mywebapp
● 外部服务Service
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
Endpoints
apiVersion: v1
kind: Endpoints
metadata:
name: my-service
subsets:
- addresses:
- ip: 10.254.74.3
ports:
- port: 8080
7.2配置属性说明:
● metadata.namespace:命名空间,默认为default
● spec.type:Service的类型,指定Service的访问方 式,默认值为ClusterIP。取值范围如下:
ClusterIP:虚拟服务的IP,用于k8s 集群内部的pod访问,在Node上kubeproxy通过设置的Iptables规则进行转 发。
NodePort:使用宿主机的端口,使 用能够访问各Node的外部客户端通过 Node的IP地址和端口就能访问服务。
LoadBalancer: 使用外接负载均衡器完成 到服务的负载分发,需要在 spec.status.loadBalancer字段指定外部 负载均衡器的IP地址,并同时定义 nodePort和clusterIP,用于公有云环境。
● spec.clusterIP:虚拟服务的IP地址,当type=clusterIP 时,如果不指定,则系统进行自动分配。也可以手工指定。当 type=LoadBalancer时,则需要指定
● spec.sessionAffinity:是否支持Session,可选值为ClientIP, 表示将同一个源IP地址的客户端访问请求 都转发到同一个后端Pod。默认值为空
● spec.ports[].protocol:端口协议,支持TCP和UDP,默认值为 TCP
● spec.ports[].port:服务监听的端口号
● spec.ports[].targetPort:需要转发到后端Pod的端口号
● spec.ports[].nodePort:当spec.type=NodePort时,指定映射到 物理机的端口号
● status:当spec.type=LoadBalancer时,设置外部负载均衡器的地址,用于公有云环境
● status.loadBalancer.ingress:外部负载均衡器
三、详细配置
apiVersion: v1 //版本
kind: Pod //类型,pod
metadata: //元数据
name: string //元数据,pod的名字
namespace: string //元数据,pod的命名空间
labels: //元数据,标签列表
- name: string //元数据,标签的名字
annotations: //元数据,自定义注解列表
- name: string //元数据,自定义注解名字
spec: //pod中容器的详细定义
containers: //pod中的容器列表,可以有多个容器
- name: string //容器的名称
image: string //容器中的镜像
imagesPullPolicy: [Always|Never|IfNotPresent]//获取镜像的策略,默认值为Always,每次都尝试重新下
载镜像
command: [string] //容器的启动命令列表(不配置的话使用镜像内部的命令)
args: [string] //启动参数列表
workingDir: string //容器的工作目录
volumeMounts: //挂载到到容器内部的存储卷设置
- name: string
mountPath: string //存储卷在容器内部Mount的绝对路径
readOnly: boolean //默认值为读写
ports: //容器需要暴露的端口号列表
- name: string
containerPort: int //容器要暴露的端口
hostPort: int //容器所在主机监听的端口(容器暴露端口映射到宿主机的端口,设置hostPort时同一
台宿主机将不能再启动该容器的第2份副本)
protocol: string //TCP和UDP,默认值为TCP
env: //容器运行前要设置的环境列表
- name: string
value: string
resources:
limits: //资源限制,容器的最大可用资源数量
cpu: Srting
memory: string
requeste: //资源限制,容器启动的初始可用资源数量
cpu: string
memory: string
livenessProbe: //pod内容器健康检查的设置
exec:
command: [string] //exec方式需要指定的命令或脚本
httpGet: //通过httpget检查健康
path: string
port: number
host: string
scheme: Srtring
httpHeaders:
- name: Stirng
value: string
tcpSocket: //通过tcpSocket检查健康
port: number
initialDelaySeconds: 0//首次检查时间
timeoutSeconds: 0 //检查超时时间
periodSeconds: 0 //检查间隔时间
successThreshold: 0
failureThreshold: 0
securityContext: //安全配置
privileged: falae
restartPolicy: [Always|Never|OnFailure]//重启策略,默认值为Always
nodeSelector: object //节点选择,表示将该Pod调度到包含这些label的Node上,以key:value格式指定
imagePullSecrets:
- name: string
hostNetwork: false //是否使用主机网络模式,弃用Docker网桥,默认否
volumes: //在该pod上定义共享存储卷列表
- name: string
emptyDir: {} //是一种与Pod同生命周期的存储卷,是一个临时目录,内容为空
hostPath: //Pod所在主机上的目录,将被用于容器中mount的目录
path: string
secret: //类型为secret的存储卷
secretName: string
item:
- key: string
path: string
configMap: //类型为configMap的存储卷
name: string
items:
- key: string
path: string