Kubernetes (k8s)


Kubernetes 是用于自动部署扩展管理容器化应用程序的开源系统。
还提供了 DNS、分布式存储、ETCD 服务发现、监控、日志、负载均衡(基于链接)、灰度升级、容灾恢复...

增强工具:

// minikube start 启动一个只有一个 node(虚拟机) 的 k8s 集群

Master 负责管理整个集群
Control panel

Node 是一个虚拟机或者物理,它在 Kubernetes 集群中充当工作机器的角色,每个 Node 都有 Kubelet , 它管理 Node 而且是 Node 与 Master 通信的代理

Deployment 负责创建和更新应用程序的实例,当我们在 Kubernetes 上创建 Deployment 时,该 Deployment 会在其中创建包含容器的 Pod,扩缩 是通过改变 Deployment 中的副本数量来实现的

Pod:最小运行单元,运行在私有隔离的网络上,默认其他 Pods 可见,Pod 是 Kubernetes 抽象出来的,表示一组一个或多个应用程序容器,以及这些容器的一些共享资源。这些资源包括:
  • 共享存储,当作卷
  • 网络,作为唯一的集群 IP 地址
  • 有关每个容器如何运行的信息,例如容器映像版本或要使用的特定端口
kubectl get po

Service 定义了 Pod 的逻辑集和访问 Pod 的协议,Service 下的一组 Pod 通常由 LabelSelector 来标记,Service 用来暴露应用
  • ClusterIP (默认) - 在集群的内部 IP 上公开 Service
  • NodePort - 使用 NAT 在集群中每个选定 Node 的相同端口上公开 Service
  • LoadBalancer - 在当前云中创建一个外部负载均衡器(如果支持的话),并为 Service 分配一个固定的外部 IP
  • ExternalName - 通过返回带有该名称的 CNAME 记录,使用任意名称公开 Service

使用 kubeadm 创建集群
// 手动部署集群:https://jimmysong.io/kubernetes-handbook/practice/install-kubernetes-on-centos.html

创建 Deployment(可以指定多个镜像?):
kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1

通过代理访问 Pod(容器暴露的端口):
kubectl proxy
export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/

创建服务并导出:
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
curl $(minikube ip):$NODE_PORT