Back to Blogs
kubernetes
devops
docker
cloud-native
container

Kubernetes(K8S)进阶知识

Soloman
2021-01-23

Kubernetes(K8S)进阶知识

1 架构与组件

Kubernetes Architecture

1.1 Master节点

  • Kube-apiserver:k8s所有资源的增、删、改、查等操作的唯一入口
  • Etcd:k8s的后端数据库
  • kube-controller-manager:k8s所有资源对象的自动化控制中心,就像东厂的大总管😎
  • kube-scheduler:负责资源调度,就像公交车的调度室🚌

1.2 Node节点

  • Kube-proxy:实现通信与负载均衡
  • Kubelet:负责Pod对应的容器的创建、启停等任务,同时与Master节点密切协作实现集群管理的基本功能
  • docker容器引擎:负责本机的容器创建和管理

1.3 namespace

逻辑上的资源环境隔离,一般用于区分不同项目

# 查看所有namespace
kubectl get namespace

# 创建namespace
kubectl create namespace my-namespace

# 查看pod
kubectl get pod --namespace=my-namespace

2 管理对象

Deployment管理多个RS,RS管理多个Pod,Pod管理多个docker容器。注意:新版的Replica Set与Deployment这两个资源对象逐步替换了之前的Replication Controller。

  • Pod
  • Replication Controller(RC)
  • Replica Set(RS)
  • Deployment

2.1 kubectl命令

# 基本格式
kubectl command type name flags
# command: get-查看 describe-查看对象详细信息 delete-删除

# 简写可选参数(namespace)
kubectl get all --namespace=kube-system
kubectl get all -n kube-system

# 输出更多信息
kubectl get pod -o wide

kubectl create deployment mydep --image=nginx

kubectl describe deployment mydep

# 通过配置文件创建deployment
kubectl apply -f /path/to/my-deployment.yaml

kubectl get deployment

kubectl get replicaset

# 查看滚动升级历史
kubectl rollout history deployment mydep

# 查看单个版本详细信息
kubectl rollout history deployment mydep --revisoion=2

# 回滚到某个版本
kubectl rollout undo deployment mydep --to-revision=2

2.2 Pod

Pause容器代表着这个Pod,其IP和储存被Pod内的docker容器共用

生命周期:Pending-Running-Succeed/Failed-Unknown

# 通过配置文件创建pod
kubectl apply -f /path/to/my-pod.yaml

# 查看pod详细信息
kubectl get pod mypod -o yaml

# 查看创建pod的yaml配置文件字段解释
kubectl explain pod.apiVersion

# 进入容器
kubectl exec -it mypod /bin/bash

3 Label

标签与标签选择器,Label可以附加到各种资源对象上,例如Node、Pod、Service、RC等

# 添加新标签
kubectl label pod mypod new-label=label-value

# 查看每个pod标签信息
kubectl get pod --show-labels

# 筛选特定标签值的pod
kubectl get pod -l new-label=label-value

4 Service

逻辑上的一组pod,Kubernetes里的每个Service其实就是我们经常提起的微服务架构中的一个“微服务”。每个Service分配了一个全局唯一的虚拟IP地址,这个虚拟IP被称为Cluster IP。

4.1 实现方式

  • ClusterIP
  • NodePort
  • LoadBalancer

4.2 组件

Endpointer Controller

Kube-proxy

# 创建service
kubectl apply -f /path/to/service.yaml

# 查看service
kubectl get service
kubectl get svc

# 查看endpoints
kubectl get endpoints

# 删除service
kubectl delete svc service-name

5 其他管理方式

5.1 DaemonSet

保障每个node运行一个pod,用于部署守护进程

5.2 Job

批量创建一次性任务pod

kubectl apply -f /path/to/job.yaml

kubectl get job

5.3 CronJob

定时任务

kubectl apply -f /path/to/cronjob.yaml

kubectl get cronjobs.batch

kubectl delete cronjobs.batch cronjob-name

6 Probes

使用探针对pod进行健康检查,主要2种探针,以及3种handler执行方式:

  1. ExecAction-判断执行命令是否成功
  2. TCPSocketAction-访问指定端口
  3. HTTPGetAction-判断HTTP请求返回的状态码是否在[200, 400)之间

6.1 Liveness存活探针

判断pod是否存活,没存活则重启pod

6.2 Readiness就绪探针

判断pod是否就绪能够对外提供服务,未就绪时不会将pod与service关联

7 网络模型与通讯

CNI 网络组件

8 Volumn

8.1 EmptyDir

生命周期与pod一致,删除pod后文件也被删除,pod内部容器共享使用

8.2 hostPath

将主机上的一个文件夹挂载到pod,删除pod后文件依旧存在

8.3 PV和PVC

persistent volume

# 创建PV
kubectl apply -f mypv.yaml

获取PV
kubectl get pv

# 删除PV
kubectl delete pv mypv

persistent volume claim

# 创建PVC
kubectl apply -f mypvc.yaml

# 获取PVC
kubectl get pvc

# 删除PVC
kubectl delete pvc mypvc

9 ConfigMap和Secret

configmap管理普通非敏感配置信息

# 创建configmap的几种方法
kubectl create configmap cm-name --from-file=/path/to/config-map-dir
kubectl create configmap cm-name --from-file=/path/to/config-map-file
kubectl create configmap cm-name --from-literal=key=value
kubectl apply -f /path/to/configmap.yaml

# 获取所有configmap
kubectl get configmap

# 查看详细信息
kubectl describe configmap cm-name

secret管理敏感配置信息

# 创建secret的几种方式
kubectl create secret generic secret-name --from-file=file1.txt --from-file=file2.txt
kubectl apply -f /path/to/secret.yaml

# 获取所有secret
kubectl get secrets

# 查看详细信息
kubectl describe secrets secret-name

10 QoS

pod通过requests/limits被划分为3种从高到低的级别:

  1. Guaranteed: limits = requests,对资源有明确要求
  2. Burstable: limits > requests,对资源有一定要求
  3. BestEffort: 不指定资源限制,默认就是,对资源无要求

11 资源管理与调度

对pod调度到某个节点分为3阶段:

  1. 节点预选:筛选出满足requests最低要求的节点
  2. 节点优选:对节点打分
  3. 节点选定:取分数最高的节点
# 查看node资源
kubectl get node node-name -o yaml

12 Helm

Helm 是 Kubernetes(简称 K8s)生态中一个非常重要的 包管理工具,可以类比为 Linux 中的 aptyum。它主要用于简化 Kubernetes 应用的部署和管理,尤其是复杂应用的安装和升级。

12.1 helm包管理工具基本操作

# 查看版本详细
helm version

# 查看repo
helm repo list

# 搜索查找应用
helm search mysql

# 安装应用
helm install stable/mysql

# 删除应用
helm delete name

# 查看已安装应用
helm list

12.2 chart

helm的打包格式就是chart,是一系列相关的k8s集群资源清单。

# 创建chart
helm create chart-name

# 部署chart应用
helm install chart-name --name app-name

# 查看应用状态
helm status app-name

13 RBAC(Role Based Access Control)

认证-鉴权-访问控制

13.1 用户对象

  • User Account:集群全局
  • Service Account:仅限单个namespace内,用于pod中进程访问其他资源

13.2 RBAC对象

  • Role:namespace级别
  • ClusterRole:集群级别
  • RoleBinding
  • ClusterRoleBinding
# 查看用户
kubectl config view

# 查看service account
kubectl get sa -n namespace

# 查看Role详细信息
kubectl get role -n namespace -o yaml

# 查看ClusterRole
kubectl get clusterrole

14 参考资料

1.Kubernetes基础知识

2.Kubernetes Official Site

3.Chart Repository