Node

  • node可以是物理机或者虚拟机
  • 为了运行POD,每个节点上至少要运行container runtime(比如docker,dockerd,或者rkt),kubelet和kube-proxy

Node是core group,所以这里的group是None

  1. apiVersion: v1
  2. kind: Node
  3. metadata:
  4. annotations:
  5. kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
  6. node.alpha.kubernetes.io/ttl: "0"
  7. projectcalico.org/IPv4Address: 172.31.0.173/24
  8. projectcalico.org/IPv4VXLANTunnelAddr: 192.168.237.1
  9. volumes.kubernetes.io/controller-managed-attach-detach: "true"
  10. creationTimestamp: "2022-05-13T02:25:00Z"
  11. labels:
  12. beta.kubernetes.io/arch: amd64
  13. beta.kubernetes.io/os: linux
  14. kubernetes.io/arch: amd64
  15. kubernetes.io/hostname: kubernetes-master
  16. kubernetes.io/os: linux
  17. node-role.kubernetes.io/control-plane: ""
  18. node-role.kubernetes.io/master: ""
  19. node.kubernetes.io/exclude-from-external-load-balancers: ""
  20. name: kubernetes-master
  21. resourceVersion: "648260"
  22. uid: e7213ca1-f210-4ee0-9751-b3e2859bc23c
  23. spec:
  24. podCIDR: 192.168.0.0/24 # subnet
  25. podCIDRs:
  26. - 192.168.0.0/24
  27. taints:
  28. - effect: NoSchedule
  29. key: node-role.kubernetes.io/master
  30. # 状态上报信息
  31. status:
  32. addresses:
  33. - address: 172.31.0.173
  34. type: InternalIP
  35. - address: kubernetes-master
  36. type: Hostname
  37. # 可分配的资源
  38. allocatable:
  39. cpu: "2"
  40. ephemeral-storage: "37803678044"
  41. hugepages-1Gi: "0"
  42. hugepages-2Mi: "0"
  43. memory: 3928152Ki
  44. pods: "110"
  45. # 节点上所有资源
  46. capacity:
  47. cpu: "2"
  48. ephemeral-storage: 41019616Ki
  49. hugepages-1Gi: "0"
  50. hugepages-2Mi: "0"
  51. memory: 4030552Ki
  52. pods: "110"
  53. # 节点健康状态
  54. conditions:
  55. - lastHeartbeatTime: "2022-05-13T02:32:38Z"
  56. lastTransitionTime: "2022-05-13T02:32:38Z"
  57. message: Calico is running on this node
  58. reason: CalicoIsUp
  59. status: "False"
  60. type: NetworkUnavailable
  61. - lastHeartbeatTime: "2022-05-16T12:40:14Z"
  62. lastTransitionTime: "2022-05-13T02:24:57Z"
  63. message: kubelet has sufficient memory available
  64. reason: KubeletHasSufficientMemory
  65. status: "False"
  66. type: MemoryPressure
  67. - lastHeartbeatTime: "2022-05-16T12:40:14Z"
  68. lastTransitionTime: "2022-05-13T02:24:57Z"
  69. message: kubelet has no disk pressure
  70. reason: KubeletHasNoDiskPressure
  71. status: "False"
  72. type: DiskPressure
  73. - lastHeartbeatTime: "2022-05-16T12:40:14Z"
  74. lastTransitionTime: "2022-05-13T02:24:57Z"
  75. message: kubelet has sufficient PID available
  76. reason: KubeletHasSufficientPID
  77. status: "False"
  78. type: PIDPressure
  79. - lastHeartbeatTime: "2022-05-16T12:40:14Z"
  80. lastTransitionTime: "2022-05-13T02:32:14Z"
  81. message: kubelet is posting ready status. AppArmor enabled
  82. reason: KubeletReady
  83. status: "True"
  84. type: Ready
  85. # 镜像
  86. images:
  87. - names:
  88. - k8s.gcr.io/etcd@sha256:64b9ea357325d5db9f8a723dcf503b5a449177b17ac87d69481e126bb724c263
  89. - k8s.gcr.io/etcd:3.5.1-0
  90. sizeBytes: 292558922
  91. # 节点上的各个组件版本
  92. nodeInfo:
  93. architecture: amd64
  94. bootID: 50cc6902-78d8-48b6-ac78-8338bfe325b6
  95. containerRuntimeVersion: docker://20.10.12
  96. kernelVersion: 5.4.0-67-generic
  97. kubeProxyVersion: v1.23.6
  98. kubeletVersion: v1.23.6
  99. machineID: f1cf2447bcc7435ba71406b08929e352
  100. operatingSystem: linux
  101. osImage: Ubuntu 20.04.2 LTS
  102. systemUUID: 237753d4-525b-4ef2-b5e1-48bab8ce9c27

如何创建,删除

Namespace

  • namespace 是一组资源和对象的抽象集合,比如可以将系统内部对象划分为不同的项目或者用户组
  • 常见的 pod,service,replication controller,deployment 都属于某一个namespace(默认是default)
  • node和persistentVolumes不属于任何namespace
  1. apiVersion: v1
  2. kind: Namespace
  3. metadata:
  4. creationTimestamp: "2022-05-13T02:25:02Z"
  5. labels:
  6. kubernetes.io/metadata.name: default
  7. name: default
  8. resourceVersion: "206"
  9. uid: 154e58fc-de88-4057-97d7-82f3ec61d755
  10. spec:
  11. finalizers:
  12. - kubernetes
  13. status:
  14. phase: Active

finalizers早起出现在namespace中,后来应用场景多了后才放到metadata中

如何创建删除namespace

  1. kubectl create namespace my-namespac
  2. kubectl delete namespace my-namespac

Pod

Pod是一组关联的容器集合,是k8s调度的基本单位(以Pod为单位进行资源申请
Pod设计理念是多个容器在一个Pod中共享网络和文件系统,通过进程间通信和文件共享这种简单的方式完成应用组织

  • 默认共享网络
  • 通过挂载方式共享存储卷
  • 共享Security Context

Pod的环境变量定义方式

  • 直接设置值
  • 从Pod Spec读取某些属性
  • 从ConfigMap读取某些属性
  • 从Secret读取某些属性

待补充课程例子

存储卷

通过存储卷可以将外部存储挂载到Pod内使用
存储卷定义包含两部分:
volumes: 可以存储卷来源
补充有哪些种类
volumeMounts: 定义存储卷如何mount到容器内部

  1. containers:
  2. - name: nginx
  3. image: nginx:1.8
  4. ports:
  5. - containerPort: 80
  6. volumeMounts:
  7. - mountPath: "/usr/share/nginx/html"
  8. name: nginx-vol
  9. volumes:
  10. - name: nginx-vol
  11. hostPath:
  12. path: "/var/data"

资源限制

限制CPU和内存

  1. kubectl set resources deployment nginx-deployment-7bc6d87686-94vkr -c nginx --limits=cpu=500m,memory=128Mi

容器名从哪里获得
image.png

健康检查

探针类型

  • LivenessProbe 探测应用是否处于健康状态,如果不健康则会删除并重新创建Pod
  • ReadinessProbe 探测应用是否处于就绪且处于正常服务状态,如果异常则拒绝接收来自service的流量
  • StartupProbe 探测应用是否启动完成,如果在 failureThreshold * PeriodSeconds 周期内未就绪,则Pod会被重启

Pod可以stop或停止吗

探活方式

  • Exec
  • TCP
  • HTTP

readiness 案例和课件
image.png

ConfigMap

  • 用来将非机密数据保存到键值对中
  • 使用时,Pods可以将其作用到环境变量、命令行参数或存储卷中的配置文件
  • 将配置信息和容器镜像解耦,便于应用配置修改

—from-file 以文件名为key,内容为value
—from-env-file 忽略文件名,内容为value;忽略注释部分
—from-literal=key=value 以键值形式从命令行输入

  1. root@kubernetes-master:~# kubectl create configmap literal --from-literal=hello=world --from-literal=key=value
  2. configmap/literal created
  3. root@kubernetes-master:~# kubectl get configmap literal -o yaml
  4. apiVersion: v1
  5. data:
  6. hello: world
  7. key: value
  8. kind: ConfigMap
  9. metadata:
  10. creationTimestamp: "2022-05-16T16:18:34Z"
  11. name: literal
  12. namespace: default
  13. resourceVersion: "676986"
  14. uid: e3609d7c-6507-4713-8098-26ce54187f8b
  15. root@kubernetes-master:~#