Kubernetes
一、K8S是什么
Kubernetes([kubə’netis],重音在第三个音节,读音:库伯耐踢死) 是Google 开源的容器集群管理系统,是一个编排容器的工具,其实也是管理应用的全生命周期的一个工具,从创建应用,应用的部署,应用提供服务,扩容缩容应用,应用更新,都非常的方便,而且可以做到故障自愈,例如一个服务器挂了,可以自动将这个服务器上的服务调度到另外一个主机上进行运行,无需进行人工干涉。
通过应用容器化使应用简单、快捷的方式更新和发布,也能实现热更新、迁移等操作。使用Kubernetes能确保程序在任何时间、任何地方运行,还能扩展更多有需求的工具/资源。
如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。
使用Kubernetes可以:
- 自动化容器的部署和复制
- 随时扩展或收缩容器规模
- 将容器组织成组,并且提供容器间的负载均衡
- 很容易地升级应用程序容器的新版本
- 提供容器弹性,如果容器失效就替换它
- …
1.1 K8S重要组成
总体架构:
图中有两种节点:
- Master 节点主要负责控制和维护整个集群的状态,比如创建资源、删除资源。
- Node 节点主要负责运行任务,比如启动容器。
K8s 将集群中所有的任务抽象成资源,比如一个 Deployment 资源、一个 Pod 资源。用户面向的是一个一个资源,客户端只能通过操作这些资源来控制整个集群。这样的设计,有几个明显的好处:
- 第一就是模型非常简单和一致,对于开发者来说,只需要理解了这种资源的模式,就很容易维护 K8s 里边的任何代码。
- 第二就是通过资源这个抽象层,将模块与模块之间做了很好地隔离,从而很容易做到各模块之间的对接和独立升级维护。
集群内部涉及的组件有:
- Pod:K8s 的基本运行单元;
- ReplicaSet:Pod 的集合;
- Deployment:提供更新支持;
- StatefulSets:提供有状态支持;
- Volume:数据卷;
- Labels:标签,资源间的关联一般通过这个来实现。
1.1.1 Master 相关组件
Master 提供集群的管理控制中心,通常情况下,Master 会独立部署,不在上面跑用户容器,以保证整个集群的稳定性和安全。当然可以跑多个 Master 来达到高可用。
Master 主要组件包括:Kube-apiserver、Kube-controller-manager、Etcd。
- Kube-apiserver:用于暴露 Kubernetes API。任何的资源请求/调用操作都是通过 Kube-apiserver 提供的接口进行。
- Kube-controller-manager:运行管理控制器,它们是集群中处理常规任务的后台线程。逻辑上,每个控制器是一个单独的进程,但为了降低复杂性,它们都被编译成单个二进制文件,并在单个进程中运行。
- Etcd:Etcd 是 Kubernetes 提供默认的存储系统,保存所有集群数据。所以一般推荐使用时要为 Etcd 数据提供备份计划。
1.1.2 Node 相关组件
Node 节点负责从 Master 处接收任务并执行,适当地时候调整自己的状态或删除过期的负载。
Node 主要组件包括:Kubelet、Kube-proxy、Docker/Rkt。
-
Kubelet: kubelet 是工作节点主要的程序,它会监视已分配给节点的 pod,具体功能包括:
- 创建 Pod 所需的数据卷;
- 创建 Pod 所需的网络;
- 下载 Pod 的Secrets;
- 启动 Pod 中运行的容器;
- 定期执行容器健康检查;
- 上报节点状态。
- Kube-proxy: 通过在主机上维护网络规则并执行连接转发来实现 Kubernetes 服务抽象。
- Docker/Rkt: 用于运行容器。
1.2 K8S的全生命周期管理
在k8s进行管理应用的时候,基本步骤是:创建集群,部署应用,发布应用,扩展应用,更新应用。
1.2.1 创建集群
在创建Deployment时,Kubernetes会创建了一个Pod来托管应用。Pod是Kubernetes中一个抽象化概念,由一个或多个容器组合在一起得共享资源。
1.2.2 部署应用
[/node/bin$]$ ./kubectl run nginx --image=nginx --replicas=2 --port=80 --expose=true
service "nginx" created
deployment "nginx" created
[/node/bin$]$ ./kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-7587c6fdb6-9sd9d 0/1 Pending 0 5s
nginx-7587c6fdb6-kvfsq 0/1 Pending 0 5s
[/node/bin$]$ ./kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 51m
nginx ClusterIP 10.0.0.40 <none> 80/TCP 11s
通过指定容器镜像、副本数量及端口,就可以启动一个应用。
1.2.3 发布应用
导出服务让外部可访问. 通过 kubectl run 创建的应用,默认情况下服务是一个虚拟IP,从集群外部访问是访问不到的,这时需要用到 NodePort 类型的服务,将节点端口映射到容器内部。
[/node/bin$]$ ./kubectl expose deployment nginx --type=NodePort --name=nginx-nodeport
service "nginx-nodeport" exposed
[/node/bin$]$ ./kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx 2 2 2 0 5m
[/node/bin$]$ ./kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-7587c6fdb6-9sd9d 0/1 Pending 0 5m
nginx-7587c6fdb6-kvfsq 0/1 Pending 0 5m
[/node/bin$]$ ./kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 57m
nginx ClusterIP 10.0.0.40 <none> 80/TCP 5m
nginx-nodeport NodePort 10.0.0.67 <none> 80:30147/TCP 8s
通过 http://localhost:30147 访问应用.
二、K8S使用
2.1 常见kubectl命令
- 查看主控状态:
kubectl cluster-info
- 启动Controller-manager:
kube-controller-manager --master http://127.0.0.1:8080
- 启动schedluer:
kube-scheduler --master http://127.0.0.1:8080
- 启动Apiserver:
kube-apiserver --etcd-servers http://127.0.0.1:2379 --insecure-bind-address 192.168.139.190 --insecure-port 8080
- 启动 Kubelet 服务:
kubelet --fail-swap-on=false --kubeconfig ./kubeconfig --containerd
- 启动 Kube-proxy 服务:
kube-proxy --master http://127.0.0.1:8080
- 查看节点状态:
kubectl get nodes
Kubeconfig 文件示例如下:
[/node/bin$]$ cat kubeconfig
current-context: test-context
apiVersion: v1
clusters:
- cluster:
api-version: v1
server: http://127.0.0.1:8080
name: test-cluster
contexts:
- context:
cluster: test-cluster
namespace: default
name: test-context
kind: Config
preferences:
colors: true
REF
http://docs.kubernetes.org.cn https://gitbook.cn/books/5aadcf4f984e353193a90ddb/index.html?utm_source=dl18041002