基础组件

在Master通常上包括 kube-apiserver、etcd 存储、kube-controller-manager、cloud-controller-manager、kube-scheduler 和用于 K8s 服务的 DNS 服务器(插件)

  • kube-apiserver,集群的控制中枢,无状态的,每个控制节点都有一个,都同时工作
  • kube-controller-manager 和 kube-scheduler,所有主节点中只有一个master,同时只有一个工作
kubectl get leases -n kube-system

在这里插入图片描述

在Node上组件包括 kubelet 、kube-porxy 以及服务于pod的容器运行时(runtime)。外部storage与registry用于为容器提供存储与镜像仓库服务。

命令行工具 (kubectl)

命令行工具 (kubectl)

kubectl怎么知道连接到哪个集群

通过/etc/kubernetes/admin.conf文件找到apiServer

两种方式
方法一 设置环境变量export KUBECONFIG=/etc/kubernetes/admin.conf
方法二,如果没有KUBECONFIG变量,会去这个位置找文件~/.kube/config

kubectl config view # 显示合并的 kubeconfig 配置。

kubectl 可能连接多个集群,切换集群使用命令
kubectl config use-context my-cluster-name # 设置默认的上下文为 my-cluster-name

命令

一个简单的yaml

apiVersion: v1 # 必选,API 的版本号
kind: Pod # 必选,类型 Pod
metadata: # 必选,元数据
 name: nginx # 必选,符合 RFC 1035 规范的 Pod 名称
spec: # 必选,用于定义 Pod 的详细信息
 containers: # 必选,容器列表
 - name: nginx # 必选,符合 RFC 1035 规范的容器名称
 image: nginx:1.15.12 # 必选,容器所用的镜像的地址
 ports: # 可选,容器需要暴露的端口号列表
 - containerPort: 80 # 端口号

也可以生成一个yaml

kubectl create deployment nginx --image=nginx --dry-run=client -oyaml > nginx2-dp.yaml

创建pod

如果已经创建过,再次创建,creat 会提示报错,apply不会提示

kubectl create -f nginx.yaml
kubectl apply -f ./my-manifest.yaml           # 创建资源
kubectl apply -f ./my1.yaml -f ./my2.yaml     # 使用多个文件创建
kubectl apply -f ./dir                        # 基于目录下的所有清单文件创建资源
kubectl apply -f https://git.io/vPieo         # 从 URL 中创建资源

删除

删pod 用kubectl delete pod xxx
删deployment 用 kubectl delete deploy xxx

查看apiVersion

  • 查看pod 的apiVersion
kubectl api-resources |grep pod
  • 查看deployment的apiVersion
kubectl api-resources |grep deployment
  • 查看endpoint
kubectl get ep metrics-server -n kube-system
# 列出当前名字空间下所有 Services,按名称排序
kubectl get services --sort-by=.metadata.name

sort-by后面的字段可以通过kubectl get svc kube-dns -n kube-system -oyaml看到

查看pod 的字段的解释,对应yaml文件中的字段

kubectl explain pod
kubectl explain pod.spec

更新

Kubernetes调度基础

Deployment

创建

selector 和 template 要写成一样的,方便管理

selector:
 matchLabels:
  app: nginx
template:
 metadata:
  labels:
   app: nginx

一些常用命令

 kubectl get deploy
 kubectl rollout status deployment/nginx-deployment # 查看创建状态,nginx-deployment 为pod 的名字
 kubectl get rs -l app=nginx # 查看此 Deployment 当前对应的 ReplicaSet
 kubectl get pods --show-labels

关于 ReplicaSet

  • deployment 负责管理rs(replicaSet),rs管理pod,如果你更新了deploymnet比如换了镜像,会新建一个rs,创建新的pod,旧的rs删除旧的pod,最终达到你规定的副本数,rs主要就是管理pod符合预定的数量,重启故障pod,pod减少,比如人为删除一个,他会运行新pod,当触发一个更新后,会有新的 ReplicaSet 产生,旧的ReplicaSet 会被保存,

更新

当且仅当 Deployment 的 Pod 模板(即.spec.template)更改时,才会触发 Deployment
更新,例如更改内存、CPU 配置或者容器的 image。

假如更新 Nginx Pod 的 image 使用 nginx:latest,并使用–record 记录当前更改的参数,后期
回滚时可以查看到对应的信息:

kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --record

当然也可以使用 edit 命令直接编辑 Deployment,效果相同:

kubectl edit deployment.v1.apps/nginx-deployment

同样可以使用 kubectl rollout status 查看更新过程:

kubectl rollout status deployment.v1.apps/nginx-deployment

通过kubectl describe deploy nginx-deployment

Name: nginx-deployment
Namespace: default
...
OldReplicaSets: <none>
NewReplicaSet: nginx-deployment-6987cdb55b (3/3 replicas created)

回滚

查看 Deployment 某次更新的详细信息,使用--revision 指定某次更新版本号:

kubectl rollout history deployment/nginx-deployment --revision=3

如果只需要回滚到上一个稳定版本,使用 kubectl rollout undo 即可:

kubectl rollout undo deployment/nginx-deployment

如果要回滚到指定版本,使用–to-revision 参数:

kubectl rollout undo deployment/nginx-deployment --to-revision=2

扩容

使用 kubectl scale 动态调整 Pod 的副本数,比如增加 Pod 为 5 个:

kubectl scale deployment.v1.apps/nginx-deployment --replicas=5

暂停和恢复

大多数情况下可能需要针对一个资源文件更改多处地方,而并不需要多次触发更新,此时可以使用 Deployment 暂停功能,临时禁用更新操作,对 Deployment 进行多次修改后在进行更新。
使用 kubectl rollout pause 命令即可暂停 Deployment 更新:

kubectl rollout pause deployment/nginx-deployment

然后对 Deployment 进行相关更新操作,比如先更新镜像,然后对其资源进行限制(如果使
用的是 kubectl edit 命令,可以直接进行多次修改,无需暂停更新,kubectlset 命令一般会集成在CICD 流水线中):
进行完最后一处配置更改后,使用 kubectl rollout resume 恢复 Deployment 更新:

kubectl rollout resume deployment.v1.apps/nginx-deployment

StatefulSet

RC、Deployment、DaemonSet都是面向无状态的服务,它们所管理的Pod的IP、名字,启停顺序等都是随机的,而 StatefulSet 是,有状态的集合,管理所有有状态的服务,如MySQL、MongoDB集群等。

在StatefulSet中,Pod名字称为网络标识(hostname),还必须要用到共享存储

定义

必须先定义一个Service,其中clusterIP: None

---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: gcr.io/google_containers/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html

其中:
kind: Service定义了一个名字为Nginx的Headless Service,创建的Service格式为 nginx-0.nginx.default.svc.cluster.local,其他的类似,因为没有指定Namespace(命名空间),所以默认部署在default;
kind: StatefulSet定义了一个名字为web的StatefulSet,replicas表示部署Pod的副本数,本实例为2。

当 StatefulSet 控制器创建 Pod 时,它会添加一个标签 statefulset.kubernetes.io/pod-name,该标签的值为 Pod 的名称,用于匹配 Service。

数据持久化的StatefulSet

实际上 volumeClaimTemplates 下面就是一个 PVC 对象的模板,就类似于我们这里 StatefulSet 下面的 template,实际上就是一个 Pod 的模板,我们不单独创建成 PVC 对象,而用这种模板就可以动态的去创建了对象了,这种方式在 StatefulSet 类型的服务下面使用得非常多。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nfs-web
spec:
  serviceName: "nginx"
  replicas: 3
  selector:
    matchLabels:
      app: nfs-web
  template:
    metadata:
      labels:
        app: nfs-web
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
      annotations:
        volume.beta.kubernetes.io/storage-class: course-nfs-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

创建

kubectl create -f sts-web.yaml # 也可以使用-n 部署到其他 namespace
kubectl get sts
kubectl get svc
kubectl get po -l app=nginx

扩容和缩容

可以通过更新 replicas 字段扩容/缩容 StatefulSet

kubectl scale sts web --replicas=5

更新策略

RollingUpdate(滚动更新)更新策略会自动更新一个 StatefulSet 中所有的 Pod,采用与序号索引相反的顺序进行滚动更新。

{"spec":
	{"updateStrategy":{"type":"RollingUpdate"}}
}

查看更改后的 StatefulSet:

kubectl get sts web -o yaml | grep -A 1 "updateStrategy"

在更新过程中可以使用 kubectl rollout status sts/<name> 来查看滚动更新的状态:

kubectl rollout status sts/web

分段更新

更新大于等于3的比如web-3,web-4,web-5,而web-0,web-1,web-2 不更新

{"spec":{"updateStrategy":
	{"type":"RollingUpdate", 
	"rollingUpdate":{"partition":3}}
	}
}

删除

使用级联删除时,StatefulSet 和它的 Pod 都会被删除
省略--cascade=false 参数即为级联删除:

kubectl delete statefulset web

守护进程集 DaemonSet

如果指定了.spec.template.spec.nodeSelector,DaemonSet Controller 将在与 Node Selector(节点选择器)匹配的节点上创建 Pod,比如部署在磁盘类型为 ssd 的节点上(需要提前给节点定义标签 Label):

 nodeSelector:
   disktype: ssd
kubectl get node --show-labels
kubectl get ds -oyaml

查看更新状态

kubectl rollout status ds/<daemonset-name>

列出所有修订版本

kubectl rollout history daemonset <daemonset-name>

回滚到指定 revision

kubectl rollout undo daemonset <daemonset-name> --to-revision=<revision>

deployment回滚的副本保存到rs 中
但是,daemonset 保存到controllerrevison中

kubectl get controllerrevison

docker 底层

Docker存储驱动之–overlay2

其他

  • 如何查看一条命令返回0,0代表成功,1 代表失败 ,用$?
  • 对指定状态码进行get请求,200-400之间正常curl -I www.baidu.com
  • sh -c 命令,解决命令的权限问题,可以扩大权限的范围,它可以让 bash 将一个字串作为完整的命令来执行,这样就可以将 sudo 的影响范围扩展到整条命令
  • nslookup解析域名为IP地址,nslookup baidu.com
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐