一些原理和理论

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.

照例,我是资料的搬运工

Bubernetes 中文文档


写给大家看的“不负责任” K8s 入门文档

这是一个比较简单但是又比较全面的 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 提供可用的集群资源用于以保持数据、运行作业、维护工作负载、创建网络路由等。

Configuration Best Practices

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

场景:需要在节点里使用物理机上跑的服务

https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/#accessing-services-running-on-the-cluster

获取本机的 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

直接看官方的文档

https://kubernetes.io/docs/reference/kubectl/cheatsheet

欢迎留言>_<

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据