2020-05-07 工具 Kubernetes,笔记,集群 2,197
一些原理和理论
Don’t use naked Pods (that is, Pods not bound to a ReplicaSet or Deployment) if you can avoid it. Naked Pods will not be rescheduled in the event of a node failure.
照例,我是资料的搬运工
这是一个比较简单但是又比较全面的 k8s 架构
运行编排系统的服务器叫做 master 节点,把运行业务容器的服务器叫做 worker 节点。
我们把 master 上提供管理接口的组件称为 kube apiserver,对应的还需要两个用于和 api server 交互的客户端:
- 一个是提供给集群的运维管理员使用的,我们称为 kubectl;
- 一个是提供给 worker 节点使用的,我们称为 kubelet。
那 master 又是怎么知道各个 worker 上的资源消耗和容器的运行情况的呢?这个简单,我们可以通过 worker 上的 kubelet 周期性的主动上报节点资源和容器运行的情况,然后 master 把这个数据存储下来,后面就可以用来做调度和容器的管理使用了。至于数据怎么存储,我们可以写文件、写 db 等等,不过有一个开源的存储系统叫 etcd,满足我们对于数据一致性和高可用的要求,同时安装简单、性能又好,我们就选 etcd 吧。
那 master 又该如何实现和管理容器间的网络通信呢?首先每个容器肯定需要有一个唯一的 ip 地址,通过这个 ip 地址就可以互相通信了,但是彼此通信的容器有可能运行在不同的 worker 节点上,这就涉及到 worker 节点间的网络通信,因此每个 worker 节点还需要有一个唯一的 ip 地址,但是容器间通信都是通过容器 ip 进行的,容器并不感知 worker 节点的 ip 地址,因此在 worker 节点上需要有容器 ip 的路由转发信息,我们可以通过 iptables、ipvs 等技术来实现。那如果容器 ip 变化了,或者容器数量变化了,这个时候相关的 iptables、ipvs 的配置就需要跟着进行调整,所以在 worker 节点上我们需要一个专门负责监听并调整路由转发配置的组件,我们把这个组件称为 kube proxy。
我们已经解决了容器间的网络通信,但是在我们编码的时候,我们希望的是通过域名或者 vip 等方式来调用一个服务,而不是通过一个可能随时会变化的容器 ip。因此我们需要在容器 ip 之上再封装出一个 service 的概念,这个 service 可以是一个集群的 vip,也可以是一个集群的域名,为此我们还需要一个集群内部的 DNS 域名解析服务。
如何学习、了解kubernetes? - 阿里云官网的回答 - 知乎
- Pod:是 Kubernetes 中最小的可互动单元。一个 Pod 可以由多个容器组成,这些容器共同部署在单个节点上形成一个单元。一个 Pod 具有一个 IP,该 IP 在其容器之间共享。
- Node(节点):Node 是机器。它们是 Kubernetes 用于部署 Pod 的“裸机”(或虚拟机)。Node 为 Kubernetes 提供可用的集群资源用于以保持数据、运行作业、维护工作负载、创建网络路由等。
Configure a Pod to Use a ConfigMap
安装配置
先装 kubectl https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-on-macos
然后装 minikube https://kubernetes.io/docs/tasks/tools/install-minikube/
Minikube
运行
https://minikube.sigs.k8s.io/docs/drivers
访问本地服务
https://github.com/kubernetes/minikube/issues/2735
场景:需要在节点里使用物理机上跑的服务
获取本机的 ip
https://minikube.sigs.k8s.io/docs/handbook/host-access
minikube ssh "route -n | grep ^0.0.0.0 | awk '{ print \$2 }'"
然后可以在物理机的 host 文件中添加一句
192.168.64.1 minikube.host
上面的 ip 就是上条命令得到的。
然后加一个服务
apiVersion: v1
kind: Service
metadata:
name: minikube-host
spec:
type: ExternalName
externalName: minikube.host
那么其他服务就可以用 minikube-host
访问物理机了
使用本地镜像
问题:为啥本地的镜像用不了?Pod 的状态是 ImagePullBackOff
解决方案:https://stackoverflow.com/questions/42564058/how-to-use-local-docker-images-with-minikube
eval $(minikube docker-env)
然后就是 minikube 的 docker 环境了,可以用 docker 来 build 镜像
外部访问内部集群 service
minikube service <service-name> --url
就能得到外部访问的链接了
均衡负载
https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer
常用命令
使用某个配置文件
kubectl apply -f <filename>
同时查看 Pod、Deployment、Service 的列表
kubectl get all
Pod
查看 pod 列表
kubectl get pod
查看特定 pod 详细信息
kubectl describe pod <pod-name>
Deployment
查看 deployment 列表
kubectl get deployment
查看特定 deployment 详细信息
kubectl describe deployment <deployment-name>
重启
kubectl rollout restart deployment <deployment-name>
Service
查看 service 列表
kubectl get service
删除
kubectl get all
kubectl delete <name>
查看日志
kubectl get all
kubectl logs <name>
进入某个 Pod 的终端
kubectl exec -it <pod-name> -- /bin/sh
Cheat Sheet
直接看官方的文档