Kubernetes

Viewing, finding resources

# Get commands with basic output
kubectl get services                          # List all services in the namespace
kubectl get pods --all-namespaces             # List all pods in all namespaces
kubectl get pods -o wide                      # List all pods in the current namespace, with more details
kubectl get deployment my-dep                 # List a particular deployment
kubectl get pods                              # List all pods in the namespace
kubectl get pod my-pod -o yaml                # Get a pod's YAML

# Describe commands with verbose output
kubectl describe nodes my-node
kubectl describe pods my-pod

# print logs
kubectl logs my-pod

Creating objects

kubectl apply -f ./my-manifest.yaml            # create resource(s)
kubectl apply -f ./my1.yaml -f ./my2.yaml      # create from multiple files
kubectl apply -f ./dir                         # create resource(s) in all manifest files in dir
kubectl apply -f https://git.io/vPieo          # create resource(s) from url
kubectl create deployment nginx --image=nginx  # start a single instance of nginx

# create a Job which prints "Hello World"
kubectl create job hello --image=busybox -- echo "Hello World" 

# create a CronJob that prints "Hello World" every minute
kubectl create cronjob hello --image=busybox   --schedule="*/1 * * * *" -- echo "Hello World"  

模版文件

可以通过 kubectl explain pod 详细查看Pod资源所支持的所有字段的详细说明

简单示例

apiVersion: v1
kind: Pod
metadata:
  name: examplepod
spec:
  containers:
  - name: examplepod-container
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c']
    args: ['echo "Hello Kubernetes"; sleep 3600']

模版文件详解

apiVersion: v1            #版本,必填,v1代表稳定版本 
kind: pod                 #类型,必填,Pod 
metadata:                 #元数据,表示资源的标识信息 
  name: String            #元数据,必填,Pod的名字 
  namespace: String       #元数据,Pod的命名空间
   labels:                 #元数据,标签列表
     - key: value          #元数据,可定义多个标签的键/值对
   annotations:            #元数据,自定义注解列表
     - key: value          #元数据,可定义多个注解的键/值对 
spec:                     #Pod中容器的详细定义,必填 
  containers:             #Pod中的容器列表,必填,可以有多个容器
   - name: String          #容器名称,必填
     image: String         #容器中的镜像地址,必填 
    imagePullPolicy: [Always|Never|IfNotPresent]#获取镜像的策略,Always表示下载镜像;
     #IfNotPresent表示优先使用本地镜像,否则下载镜像;Never表示仅使用本地镜像
     command: [String]     #容器的启动命令列表(不配置的话,使用镜像内部的命令)
     args: [String]        #启动命令参数列表
     workingDir: String    #容器的工作目录
     volumeMounts:         #挂载到容器内部的存储卷设置
     - name: String        #为了引用Pod定义的共享存储卷的名称,要用volumes[]部分定义的卷名 
      mountPath: String   #存储卷在容器内挂载的绝对路径,应少于512个字符 
      readOnly: boolean   #是否为只读模式
     ports:                #容器需要暴露的端口号列表
     - name: String        #端口名称
       containerPort: int  #容器要暴露的端口
       hostPort: int       #容器所在主机监听的端口(把容器暴露的端口映射到宿主机的端口)
       protocol: String    #端口协议,支持TCP和UDP,默认为TCP 
    env:                  #容器运行前要设置的环境变量列表 
    - name: String        #环境变量名称 
      value: String       #环境变量值
    resources:            #资源限制和请求的设置 
      limits:             #资源限制的设置 
        cpu: String       #CPU的限制,单位为CPU内核数。将用于docker run --cpu-quota 参数,
         #也可以使用小数,例如0.1,0.1等价于表达式100m,表示100milicpu 
        memory: String    #内存限制,单位可以为MiB/GiB/MB/GB(1MiB=1024×1024B,
         #1MB=1000×1000B),将用于docker run --memory参数
       requests:           #资源请求的设置
         cpu: String       #CPU请求,容器启动时的初始可用数量,将用于docker run --cpu-shares参数 
        memory: String    #内存请求,容器启动时的初始可用数量
     livenessProbe:        #Pod内容器健康检查的设置,当探测几次无响应后将自动重启该容器,
     #检查方法有exec、httpGet和tcpSocket,对一个容器只要设置一种方法即可
       exec:               #通过exec方式来检查Pod内各容器的健康状况 
        command: [String] #exec方式需要指定的命令或脚本
       httpGet:            #通过httpGet方式来检查Pod中各容器的健康状况,需要指定path、port 
        path: String 
        port: number
         host: String 
        scheme: String 
        httpHeaders: 
        - name: String
          value: String
       tcpSocket:          #通过tcpSocket检查Pod中各容器的健康状况 
        port: number 
      initialDelaySeconds: 0 #容器启动完成后,首次探测的时间(单位为秒)
       timeoutSeconds: 0      #对容器进行健康检查时探测等待响应的超时时间(单位为秒,默认为1s)
       periodSeconds: 0       #对容器监控检查的定期探测时间设置(单位为秒),默认10s一次
       successThreshold: 0
       failureThreshold: 0 
      securityContext:       #安全配置
         privileged: false 
    restartPolicy: [Always|Never|OnFailure]#Pod的重启策略,Always表示不管以何种方式终止
     #运行,kubelet都将重启;OnFailure表示只有Pod以非0码退出才重启;Never表示不再重启该Pod 
    nodeSelector: object     #节点选择,设置nodeSelector表示将该Pod调度到包含这个标签的
     #节点上,以key:value格式来指定
     imagePullSecrets:        #拉取镜像时使用的secret名称,以key:secretkey格式指定
     - name: String 
    hostNetwork: false       #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络 
  volumes:                   #在该Pod上定义共享存储卷列表 
  - name: String             #共享存储卷名称 
    emptyDir: {}             #类型为emptyDir的存储卷,与Pod有相同生命周期的一个临时目录,为空值 
    hostPath:                #类型为hostPath的存储卷,将会挂载Pod所在宿主机的目录 
      path: string           #Pod所在宿主机的目录,该目录将在容器中挂载
     secret:                  #类型为secret的存储卷,在容器内部挂载集群中预定义的secret对象
       secretName: String
       items: 
      - key: String 
        path: String 
    configMap:               #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
       name: String
       items:
       - key: String 
        path: String

Interacting with running Pods

kubectl logs my-pod                                 # dump pod logs (stdout)

kubectl run -i --tty busybox --image=busybox -- sh  # Run pod as interactive shell

kubectl exec my-pod -- ls /                         # Run command in existing pod (1 container case)

kubectl top pod POD_NAME --containers               # Show metrics for a given pod and its containers

数据卷

本地存储卷

emptyDir

emptyDir 是指一个纯净的空目录,这个目录映射到主机的一个临时目录下,Pod中的容器都可以读写这个目录,其生命周期和Pod完全一致。如果Pod销毁,那么存储卷也会同时销毁。emptyDir主要用于存放和共享Pod的不同容器之间在运行过程中产生的文件。

apiVersion: v1
 kind: Pod 
metadata: 
  name: examplepodforemptydir 
spec: 
  containers: 
  - name: containerforwrite
     image: busybox 
    imagePullPolicy: IfNotPresent
     command: ['sh', '-c']
     args: ['echo "test data!" > /write_dir/data; sleep 3600']
     volumeMounts:
     - name: filedata 
      mountPath: /write_dir
   - name: containerforread 
    image: busybox
     imagePullPolicy: IfNotPresent
     command: ['sh', '-c']
     args: ['cat /read_dir/data; sleep 3600'] 
    volumeMounts:
     - name: filedata
       mountPath: /read_dir
  volumes:
  - name: filedata
    emptyDir: {}

hostPath

hostPath主要用于把主机上指定的目录映射到Pod中的容器上。如果Pod需要在主机上存储和共享文件,或使用主机上的文件,就可以使用这种方式。存放在主机上的文件不会被销毁,会永久保存。Pod销毁后,若又在这台机器上重建,则可以读取原来的内容,但如果机器出现故障或者Pod被调度到其他机器上,就无法读取原来的内容了。

apiVersion: v1 
kind: Pod
 metadata: 
  name: examplepodforhostpath 
spec: 
  containers:
   - name: containerforhostpath 
    image: busybox
     imagePullPolicy: IfNotPresent 
    command: ['sh', '-c']
     args: ['echo "test data!" > /write_dir/data; sleep 3600'] 
    volumeMounts:
     - name: filedata 
      mountPath: /write_dir
  volumes:
  - name: filedata
    hostPath:
      path: /home/k8sadmin/testhostpath

网络

Service

Service发布的5种方式:

  • ClusterIP-普通Service:分配一个集群内部固定虚拟ClusterIP地址,集群中的机器(即Master和Node)以及集群中的Pod都可以访问它。
  • NodePort:基于ClusterIP方式,将“ClusterIP:端口”映射到各个集群机器(即Master和Node)的指定端口上,集群外部的机器通过“NodeIP:Node端口”进行访问。
  • LoadBalancer:基于ClusterIP方式和NodePort方式,申请使用外部负载均衡器,由负载均衡器映射到各个“NodeIP:Node端口”上。
  • ClusterIP -无头Service:一种特殊的向内发布方式。它不提供负载均衡功能,也没有单独的Service IP地址,开发人员可以自己控制负载均衡策略。
  • ExternalName:将外部服务引入进来,通过一定格式映射到集群,为集群内部提供服务。

Ingress

Service 几乎都是通过节点端口形式向外暴露服务的,Service 一旦变多,每个节点上开启的端口也会变多。

Ingress 可以把多个 Service 划分到同一虚拟主机名称的多个子路径下,也可以把多个 Service 划分到多个虚拟主机名称下,还可以混合使用前两种方式。由 Ingress 接收外部请求,然后按照域名配置转发给各个后端服务。

调度

# 让节点暂时不可被调度
kubectl cordon node-name

# 将节点上的pod赶到其他节点上
kubectl drain node-name

# 取消节点不可被调度的状态
kubectl uncordon node-name

References