k8s学习(3)-kubectl && Deployment && StatefulSet
在Master通常上包括 kube-apiserver、etcd 存储、kube-controller-manager、cloud-controller-manager、kube-scheduler 和用于 K8s 服务的 DNS 服务器(插件)在Node上组件包括 kubelet 、kube-porxy 以及服务于pod的容器运行时(runtime)。外部storage与registry用于为容
k8s学习(3)- kubectl && Deployment && StatefulSet
基础组件
在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怎么知道连接到哪个集群
通过/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 底层
其他
- 如何查看一条命令返回0,0代表成功,1 代表失败 ,用
$?
- 对指定状态码进行get请求,200-400之间正常
curl -I www.baidu.com
sh -c
命令,解决命令的权限问题,可以扩大权限的范围,它可以让 bash 将一个字串作为完整的命令来执行,这样就可以将 sudo 的影响范围扩展到整条命令nslookup
解析域名为IP地址,nslookup baidu.com
更多推荐
所有评论(0)