简介

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

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

集群分布示例图如下

img

常用指令

hello-world-nodejs为例

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