Pod

运行中的一组容器,Pod是k8s中应用的最小单位。

  1. kubectl run mynginx --image=nginx
  2. 查看default名称空间的pod
  3. kubectl get pod
  4. 描述
  5. kubectl describe pod podname
  6. 删除
  7. #kubectl delete pod podname1 podname2 -n namespace (默认是default)
  8. 查看pod日志
  9. kubectl logs podname
  10. 每个pod k8s都会分配一个独立的ip
  11. kubectl get pod -owide

:::info 集群中的任意一个机器以及任意的应用都能通过pod分配的ip来访问这个pod :::

  1. #指定api版本标签
  2. apiVersion: v1
  3. #定义类型
  4. kind: Pod
  5. #定义元数据信息(名称,ns,标签等)
  6. metadata:
  7. labels: #定义资源标签 pod的
  8. run: mynginx
  9. name: mynginx
  10. namespace: default
  11. #定义资源需要的参数属性
  12. spec:
  13. containers: #定义容器属性
  14. - image: nginx #镜像版本
  15. name: mynginx #容器名

kubectl apply -f mynginx.yaml

多容器Pod

apiVersion: v1
kind: Pod
metafata:
  labels:
    run: myapp
  name: myapp
spec:
  containerss:
    - image: nginx
      name: nginx
    - image: tomcat:8.5.68
      name: tomcat

Deployment

控制Pod,使Pod拥有多副本,自愈,扩缩容等能力

多副本

kubectl create deployment my-dep --image=nginx --replicas=3
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: my-dep
  name: my-dep
spec:
  replicas: 3 #副本数量
  selector: #定义标签选择器
    matchLabels: #定义匹配标签
      app: my-dep #匹配上面的标签,需要与labels中的app一致
  template: #定义模板,如果有多个模板所有副本的属性会按照模板配置进行匹配
    metadata:
      labels:
        app: my-dep
    spec:
      containers:
      - image: nginx

扩容

kubectl scale --replicas=5 deployment/my-dep

或者修改文件

kubectl edit deployment my-dep
#修改 replicas

自愈&故障转移

  • 停机
  • 删除pod
  • 容器崩溃
  • ……

故障转移的时间根据需求设定,默认5分钟

滚动更新

#-- record 记录操作
kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record
#查看deployment状态
kubectl rollout status deployment/my-dep

版本回退

#查看历史记录
kubectl rollout history deployment/my-dep
#查看某个历史详情
kubectl rollout history deployment/my-dep --revision=2
#回滚(回到上次)
kubectl rollout undo deployment/my-dep
#回滚(回到指定版本)
kubectl rollout undo deployment/my-dep --to-revision=2

其它工作负载

image.png

service

将一组Pods公开为网络服务的抽象方法

#暴露Deploy
kubectl expose deployment my-dep --port=8000 --target-port=80
#使用标签检索Pod
kubectl get pod -l app=my-dep
apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-dep
  name: my-dep
spec:
  selector:
    app: my-dep
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 80

ClusterIP

Service的IP地址,此为虚拟IP地址。外部网络无法ping通,只有kubernetes集群内部访问使用。

#等同于没有--typed
kubectl expose deployment my-dep --port=8000 --target-port=80 --type=ClusterIP
apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-dep
  name: my-dep
spec:
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 80
  selector:
    app: my-dep
  type: ClusterIP

NodePort

每个Service都会在Node节点上开通一个端口,外部可以通过NodeIP:NodePort即可访问Service里的Pod,和我们访问服务器部署的项目一样,IP:端口/项目名

kubectl expose deployment my-dep --port=8000 --target-port=80 --type=NodePort
apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-dep
  name: my-dep
spec:
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 80
  selector:
    app: my-dep
  type: NodePort

NodePort范围在30000-32767之间
kubectl get svc 查看service