简介

Kubernetes (俗称 K8s) 是 Docker 和 containerd 等容器技术的编排引擎
也就是说,k8s 是用来管理集群的工具

集群包含 master/kubectl/kubelet 等组件
集群的单位是 node, node 里可以有许多 pod, pod 里可以有一个及以上的容器

集群分布示例图如下

img

常用指令

hello-world-nodejs 为例

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# describe
kubectl -n <namespace> describe pod xxxx
kubectl describe node <NodeName>

# get
kubectl get deploy helloworld-nodejs -o yaml --export > helloworld-nodejs-deploy.yaml
kubectl get deploy -o wide
kubectl get svc -o wide
kubectl get endpoints helloworld-nodejs -o wide
kubectl get pod -o wide -A
kubectl get ClusterRole -n kube-system
kubectl get ClusterRoleBinding -n kube-system
kubectl get Deployments -n kube-system
kubectl get Pods -n kube-system
kubectl get ServiceAccounts -n kube-system
kubectl get CustomResourceDefinition -n kube-system
kubectl get replicasets -n kube-system
kubectl get replicationcontrollers -n kube-system
kubectl get services -n kube-system
kubectl get jobs -n kube-system
kubectl get node --show-labels

# exec
kubectl exec <pod-name> -- date
kubectl exec -it <pod-name> -c <container-name> -- bash

# log
kubectl logs <pod-name>

# something
kubectl run hello-world-nodejs --replicas=5 --labels="app=hello-world-nodejs" --image=docker.io/xzxiaoshan/helloworld-nodejs:latest --port=8080
kubectl -n default delete pod xxxx
kubectl -n default delete pod --all
kubectl scale deployment helloworld-nodejs --replicas=7
kubectl expose deployment helloworld-nodejs --type=NodePort --port=80 --target-port=8080 --nodePort=30001
kubelet edit svc hello-world-deployment

概念

Kubectl

管理 Kubernetes 的 CLI 工具。

master

控制节点的中心主机(可以有多台。

kubelet

节点代理,确保容器运行且正常运行。

Kubernetes- Pod

一个 Pod 可以托管多个容器 container 和存储卷 volume.

Pod 是部署的实例.

Pod 的任何数据会在销毁时消失 (除非存入卷里). 也就是说,Pod 是部署的基本单位

controller

一个抽象的概念,代表一群 pods 的控制器对象

例如:
pod/deployment/replicaset/daemonset 都是 controller

一个控制器的功能

  • 查看系统状态
  • 监控状态是否匹配对应要求(例如 “需要为此 Pod 分配一个节点”)
  • 重复

replicaSet

k8s 的 controller 之一

一个 replicaSet 管理的 pod 应该是一群完全相同的复制体

Pod 必须标有与 replicaSet 匹配的标签,并且它不能同时被另一个 controller 拥有,以便 replicaSet 可以获取它。

只需更改 Pod 的标签,即可将 Pod 与 RS 隔离。

deployment

k8s 的 controller 之一

deployment 是要创建的 Pod 的蓝图。它将根据模板中的规范创建一个 Pod。可以管理 / 更新 / 扩展 pod

一个 deployment 管理的 pod 应该是一群属性或功能上相同或相似的

replicaSet 无法更改容器模板,而 deployment 通过调用 replicaSet 的方式来控制 pod, 实现了更新 pod

img

Scheduler

k8s 调度器,也是 controller 之一

负责将 pod 调度到 node 上 (通过一些特定的算法)

daemonSet

k8s 的 controller 之一

一个 daemonSet 管理的 pod 应该是部分或每个节点 (node) 各一个,类似于守护进程

它的创建是为了一个特定目的:确保它管理的 Pod 在所有集群节点上运行。一旦节点加入集群,DaemonSet 就会确保它在其上运行必要的 Pod。当节点离开群集时,这些 Pod 将被回收。

通信方式:

  • pod 主动推送
  • IP 和特定端口模式
  • DNS 模式,让 endpoint 去发现 pod
  • 服务模式,Node 通过随机端口公开 pod

StatefulSets

k8s 控制器之一,用于管理和维护 1 或多个 pod

应用程序分为有状态 (如 MySQL 集群) 和无状态 (如 nginx 集群)

StatefulSet 用于管理有状态集群,pod 之间不可互换,有唯一身份

deployment 用于管理无状态集群,Pod 之间是可以互换的

Service

service 负责使我们的 Pod 在网络内可被发现,或将它们暴露给互联网 (需要公网 IP), 或者前后端通信。

service 通过其 label-selector 来标识 Pod。

访问方式:

  • 环境变量
  • DNS (域名或者 IP)

暴露方式:

  • ClusterIP (对内)
  • NodePort
  • LoadBalancer
  • Ingress (另一个对象,指向 service)

一个服务可以有多个端口

service 有如下三种类型

cluster-IP
deployment 仅在集群内可见。
deployment 可以获得分配给它的内部 cluster-IP。
流量在 deployment 的 Pod 之间进行负载均衡。

Node Port
deployment 在集群内可见。
deployment 绑定到主节点 (node) 的端口。
每个节点都会将该端口代理到对应的 service。
该 service 可在 http(s)://IP 下访问
流量在 deployment 的 Pod 之间进行负载平衡。

img

Load Balancer:
deployment 获得分配的公共 IP 地址。
该服务位于 http(s)://IP:80
流量在 deployment 的 Pod 之间进行负载平衡。

img

Jobs

控制器会保证容器按数量和状态运行

jobs 可以让容器运行之后转瞬即逝,类似于云函数的功能

Secret

Secret 是一个对象,我们可以在其中存储敏感信息 (加密信息),例如用户名和密码。
在秘密文件中,值是 base64 编码的。

Ingress

Ingress 是一个对象,允许从 Kubernetes 集群外部访问 Kubernetes 服务

可以创建规则集合来配置访问权限,类似于 IPtable

img

Cluster Networking

//todo

NetworkPolicy

//todo


参考文章
https://collabnix.github.io/kubelabs/Kubernetes_Architecture.html