K8s-day4-kubectl常用命令+资源控制器
文章目录
kubectl常用命令与资源控制器
-
强制删除资源
# 强制删除Pod kubectl delete pod <your-pod-name> -n <name-space> --force --grace-period=0 或 export ETCDCTL_API=3 etcdctl del /registry/pods/default/Pod_名称 # 强制删除PV kubectl patch pv pv_name -p '{"metadata":{"finalizers":null}}' # 强制删除PVC kubectl patch pvc -n namaspace pvc_name -p '{"metadata":{"finalizers":null}}' # 强制删除NameSpace ## ETCD方式删除(速度快) export ETCDCTL_API=3 etcdctl del /registry/namespaces/命名空间名称 ## json方式 1.kubectl get ns test -o json > tmp.json 2.vim tmp.json # 删除spec内的所有内容 { "apiVersion": "v1", "kind": "Namespace", "metadata": { "creationTimestamp": "2021-12-25T06:19:25Z", "deletionTimestamp": "2021-12-25T06:19:25Z", "labels": { "kubernetes.io/metadata.name": "test" }, "name": "test", "resourceVersion": "1621503", "selfLink": "/api/v1/namespaces/test", "uid": "1758691c-0ef1-44b4-8503-ede7d659ea44" }, "spec": { "finalizers": [ # 删除此行 "kubernetes" # 删除此行 ] # 删除此行 }, "status": { "phase": "Terminating" } } 3.kubectl proxy --port=8081 # 然后新开一个窗口运行kubectl proxy跑一个API代理在本地的8081端口 4.尾部改为要删除的命名空间名字 curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8081/api/v1/namespaces/命名空间名字
一、kubectl 通用命令及选项
1.查看类
# 查看节点与附加信息
kubectl get nodes -o wide
# 获取节点和服务版本信息
kubectl get nodes
# 获取节点和服务版本信息,并查看附加信息
kubectl get nodes -o wide
# 获取pod信息,默认是default名称空间
kubectl get pod
# 获取pod信息,默认是default名称空间,并查看附加信息【如:pod的IP及在哪个节点运行】
kubectl get pod -o wide
# 获取指定名称空间的pod
kubectl get pod -n kube-system
# 获取指定名称空间中的指定pod
kubectl get pod -n kube-system podName
# 获取所有名称空间的pod
kubectl get pod -A
# 查看pod的详细信息,以yaml格式或json格式显示
kubectl get pods -o yaml
kubectl get pods -o json
# 查看pod的标签信息
kubectl get pod -A --show-labels
# 根据Selector(label query)来查询pod
kubectl get pod -A --selector="k8s-app=kube-dns"
# 查看运行pod的环境变量
kubectl exec podName env
# 查看指定pod的日志
kubectl logs -f --tail 500 -n kube-system kube-apiserver-k8s-master
# 查看所有名称空间的service信息
kubectl get svc -A
# 查看指定名称空间的service信息
kubectl get svc -n kube-system
# 查看component statuses信息
kubectl get cs
# 查看所有configmaps信息
kubectl get cm -A
# 查看所有serviceaccounts信息
kubectl get sa -A
# 查看所有daemonsets信息
kubectl get ds -A
# 查看所有deployments信息
kubectl get deploy -A
# 查看所有replicasets信息
kubectl get rs -A
# 查看所有statefulsets信息
kubectl get sts -A
# 查看所有jobs信息
kubectl get jobs -A
# 查看所有ingresses信息
kubectl get ing -A
# 查看有哪些名称空间
kubectl get ns
# 查看pod的描述信息
kubectl describe pod podName
kubectl describe pod -n kube-system kube-apiserver-
# 查看指定名称空间中指定deploy的描述信息
kubectl describe deployment -n kube-system coredns
kubectl describe daemonsets.apps php
# 查看node或pod的资源使用情况(需要heapster 或metrics-server支持)
kubectl top node
kubectl top pod
# 查看集群信息
kubectl cluster-info 或 kubectl cluster-info dump
# 查看各组件信息(172.16.1.110为master机器)
kubectl -s https://172.16.1.110:6443 get componentstatuses
2.操作类
- create:有则不建,无则创建
- apply :有则更新,无则创建
# 创建资源
kubectl create -f xxx.yaml
# 应用资源
kubectl apply -f xxx.yaml
==========================================================================================
# 应用资源,该目录下的所有 .yaml, .yml, 或 .json 文件都会被使用
kubectl apply -f <directory>
# 创建test名称空间
kubectl create namespace test
==========================================================================================
# 针对不同类型pod,要对应删除,否则是删不掉的,常用类型有:
pod
deployments.apps
daemonsets.apps
service
# 删除资源
kubectl delete -f xxx.yaml
kubectl delete -f <directory>
# 删除指定的pod
kubectl delete pod podName
# 删除指定名称空间的指定pod
kubectl delete pod -n test podName
# 删除其他资源
kubectl delete svc svcName
kubectl delete deploy deployName
kubectl delete ns nsName
# 强制删除其他资源
kubectl delete svc --grace-period=0 --force
# 强制删除
kubectl delete pods <pod> --grace-period=0 --force
kubectl delete pod podName -n nsName --grace-period=0 --force
kubectl delete pod podName -n nsName --grace-period=1
kubectl delete pod podName -n nsName --now
# 编辑资源
kubectl edit pod podName
3.进阶类
# kubectl exec:进入pod启动的容器
kubectl exec -it podName -n nsName /bin/sh #进入容器
kubectl exec -it podName -n nsName /bin/bash #进入容器
# kubectl label:添加label值
kubectl label nodes k8s-node01 zone=north #为指定节点添加标签
kubectl label nodes k8s-node01 zone- #为指定节点删除标签
kubectl label pod podName -n nsName role-name=test #为指定pod添加标签
kubectl label pod podName -n nsName role-name=dev --overwrite #修改lable标签值
kubectl label pod podName -n nsName role-name- #删除lable标签
# kubectl滚动升级; 通过 kubectl apply -f myapp-deployment-v1.yaml 启动deploy
kubectl apply -f myapp-deployment-v2.yaml #通过配置文件滚动升级
kubectl set image deploy/myapp-deployment myapp="registry.cn-beijing.aliyuncs.com/google_registry/myapp:v3" #通过命令滚动升级
kubectl rollout undo deploy/myapp-deployment 或者 kubectl rollout undo deploy myapp-deployment #pod回滚到前一个版本
kubectl rollout undo deploy/myapp-deployment --to-revision=2 #回滚到指定历史版本
# kubectl scale:动态伸缩
kubectl scale deploy myapp-deployment --replicas=5 # 动态伸缩
kubectl scale --replicas=8 -f myapp-deployment-v2.yaml #动态伸缩【根据资源类型和
二、NameSpace名称空间
1.查看名称空间
- k8s中名称空间是用来隔离集群资源,而k8s中的资源也分为名称空间级资源以及集群级资源
- kubectl是k8s客户端,它跟k8s没有任何关系,就像mysql是mysqld的客户端(一个连接管理工具而已)
- 注:部署应用一般是部署在自己的名称空间之内
格式:
kubectl get ns
kubectl get namespace
查看名称空间:
# 方式一
[root@k8s-master1 ~] kubectl get namespace
NAME STATUS AGE
default Active 5d16h
kube-node-lease Active 5d16h
kube-public Active 5d16h
kube-system Active 5d16h
# 方式二
[root@k8s-master1 ~] kubectl get ns
NAME STATUS AGE
default Active 5d16h
kube-node-lease Active 5d16h
kube-public Active 5d16h
kube-system Active 5d16h
2.创建一个名称空间
格式:
kubectl create ns [Name]
kubectl create namespace [Name]
# 方式一
[root@k8s-master1 ~] kubectl create namespace wordpress
namespace/wordpress created
# 方式二
[root@k8s-master1 ~] kubectl create ns wp
namespace/wp created
# 查看
[root@k8s-master1 ~] kubectl get ns
NAME STATUS AGE
default Active 6d22h
kube-node-lease Active 6d22h
kube-public Active 6d22h
kube-system Active 6d22h
wordpress Active 1s
wp Active 94s
3.删除名称空间
格式:
kubectl delete ns [Name]
kubectl delete namespace [Name]
# 方式一
[root@k8s-master1 ~] kubectl delete namespace wp wordpress
namespace "wp" deleted
namespace "wordpress" deleted
# 方式二
[root@k8s-master1 ~] kubectl delete ns wp wordpress
namespace "wp" deleted
namespace "wordpress" deleted
4.指定名称空间创建Pod
- namespace后指定名称空间
格式:
kubectl create -f xxx.yaml 有则不建,无则创建
kubectl apply -f xxx.yaml 有则更新,无则创建
# 在资源清单指定名称空间
[root@k8s-master1 yaml] cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: wp
spec:
containers:
- name: nginx
image: nginx
- name: tomcat
image: tomcat
# 创建Pod
[root@k8s-master1 yaml] kubectl create -f nginx.yaml
pod/nginx-pod created
三、Label(标签)
- 类似docker中的tag:TAG = 仓库URL/名称空间/仓库名称:版本号
- 要具有标志性,见名知意,如:version=1.8
- k8s当做标签是用来管理(识别一系列)容器,方便与管理和监控拥有同一标签的所有容器
1.查询标签
格式:
kubectl get pod --show-lables # 查询所有标签
kubectl get pod --show-lables [Name] # 指定查询标签
# 例:查询所有标签
kubectl get pod --show-labels
# 例:指定查询标签
kubectl get pods --show-labels zabbix-agent-6h87t
2.增加标签
- 先删除,后增加
- 一个pod可拥有多个标签
格式:
kubectl lable pod [Name] [key=value]
[Name] # 容器名
[key=value] # 标签类型+标签信息
1.当前无标签
[root@k8s-master1 yaml] kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 0/2 Pending 0 17s <none>
2.增加一个标签
[root@k8s-master1 yaml] kubectl label pod nginx-pod app=nginx
pod/nginx-pod labeled
[root@k8s-master1 yaml] kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 0/2 Pending 0 2m9s app=nginx
3.再增加一个标签
[root@k8s-master1 yaml] kubectl label pod nginx-pod version=1.8
pod/nginx-pod labeled
[root@k8s-master1 yaml] kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 0/2 Pending 0 3m38s app=nginx,version=1.8
3.删除标签
格式
kubectl lable pod [Name] [标签+减号]
[root@k8s-master1 yaml] kubectl label pod nginx-pod version-
pod/nginx-pod labeled
[root@k8s-master1 yaml] kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 0/2 Pending 0 6m42s app=nginx
4.yaml标签位置格式
apiVersion: v1
kind: Pod
metadata:
name: test-tag
labels:
release: stable
spec:
containers:
- name: nginx
image: nginx
四、Replication Controller(复制控制器)
1.概念
-
简称RC,应用托管在Kubernetes之后,RC会确保任何时间Kubernetes中都有指定数量的Pod在持续运行,达到故障转移高可用的效果,因为Pod自身不具备故障转移。
-
在此基础上,RC还提供了一些更高级的特性,比如滚动升级、升级回滚等;
-
RC与Pod的关联是通过Label(标签)来实现的,Label机制是Kubernetes中的一个重要设计,通过Label进行对象的弱关联,可以灵活地进行分类和选择;
-
Label的定义是任意且可多个的,但是Label必须具有可标识性,比如设置Pod的应用名称和版本号等,另外Lable是不具有唯一性的,为了更准确的标识一个Pod,应该为Pod设置多个Lable!
2.主要功能
弹性伸缩、滚动升级
1)弹性伸缩
- 弹性伸缩是指适应负载变化,以弹性可伸缩的方式提供资源,反映到kubernetes中,指的是可根据负载的高低动态调整Pod的副本数量;调整Pod的副本数,是通过修改RC中Pod的副本来实现的
示例yaml
- 类型为RC,使用此类型,将自动拥有自愈功能(容器状态异常后,会自动起一个新的)
- 启动两个一样的Pod,通过自定义副本数,以达到弹性扩容、缩容的目的!
- 自动缩容:优先保留启动时间长的(相对稳定),先干掉新来的!
cat > shensuo.yaml <<EOF
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx-controller
spec:
replicas: 2 # 通过修改 replicas: 2 的数量
selector:
name: nginx
template:
metadata:
labels:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.18
ports:
- containerPort: 80
EOF
1> 修改yaml文件
[root@k8s-master1 yaml] vim myweb.yaml
···
spec:
replicas: 2
···
2> 命令行跳转修改配置
[root@k8s-master1 yaml] kubectl edit RC myweb
···
spec:
replicas: 2
···
3> scale 修改(推荐)
- 非交互式
# 支持更改类型
deployment --replicas= replicaset replicationcontroller statefulset
# 扩容到10个
[root@k8s-master1 yaml] kubectl scale replicationcontroller myweb --replicas=10
# 缩容到1个
[root@k8s-master1 yaml] kubectl scale replicationcontroller myweb --replicas=1
2)滚动升级的三种方式
-
不但提供了更新服务,而且通常还提供了滚动进度查询、滚动历史记录、以及最重要的回滚等能力,通俗的说,就是具有系统或软件的主动降级的能力。
-
滚动升级实现方式:开始升级后,删除v1版本的RC,保留v2版本;然后每隔十秒逐步增加v2版本的Pod副本数,逐步减少v1的Pod副本数,先加后减,升级完成后,保留了v2,也删除了v1。
-
支持断点升级:自动记录上次失败的位置点,可选择继续升级或回退
1> 方式1:修改yaml配置文件
[root@k8s-master1 ~] kubectl edit daemonsets.apps zabbix-agent
daemonset.apps/zabbix-agent edited
2> 方式2:打标签的方式
[root@k8s-master1 ~] kubectl patch daemonsets.apps zabbix-agent -p '{"spec":{"template":{"spec":{"containers":[{"image":"zabbix/zabbix-agent:centos-5.2.4", "name":"zabbix-agent"}]}}}}'
daemonset.apps/zabbix-agent patched
3> 方式3:命令行直接升级
[root@k8s-master1 ~] kubectl set image daemonset/zabbix-agent zabbix-agent=zabbix/zabbix-agent:centos-5.2.3
daemonset.apps/zabbix-agent image updated
3)回滚降级的两种方式
- 在集群中所有的节点上部署只部署一个Pod
cat > nginx_jiangji.yaml <<EOF
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.16.0
EOF
1> 回滚到上一个版本
[root@k8s-master1 ~] kubectl rollout undo daemonset zabbix-agent
daemonset.apps/zabbix-agent rolled back
2> 回滚到指定版本
[root@k8s-master1 ~] kubectl rollout undo daemonset zabbix-agent --to-revision=1
daemonset.apps/zabbix-agent rolled back
五、Service 资源
Service是k8s中的一个重要概念与核心资源之一,主要提供负载均衡与自动发现,每一个Service就是一个“微服务”。
1.分布流程
1)举例来说:
- 在非k8s的世界里,用户通过前端的 backend(即前端的微服务Pod)来访问后端的frontend(即后端的微服务Pod)时,运维可以通过在配置文件中指定ip与主机名,来允许用户访问;在在k8s里是行不通的,因为Pod是由生命周期的,它们可以被创建/销毁,虽能通过控制器可以动态创建Pod,但Pod被分配到某个节点时,也会为其分配一个ip,而该ip是不固定的,所以不稳定也不能被依赖;因此在k8s里,可以解决这个问题,技能满足Pod的生命轮回,也能保证用户访问一个固定的ip,图内为访问流程。
2)通过上图分析:
- 最终我们的系统是由多个提供不同业务能力、且彼此独立的微服务单元组成,服务之间通过TCP/IP来通信,形成了强大灵活的弹性网络,拥有强大的分布式能力+弹性扩展能力+容错能力!
3)简单定义Service
cat > Service.yaml <<EOF
kind: Service
apiVersion: v1
metadata:
name: test-service
namespace: default
labels:
app: test-service
spec:
type: ClusterIP
selector:
app: test-service
ports:
- port: 80
targetPort: 80
EFO
2.Service 的四种类型
-
Service 是 Kubernetes 对外访问的窗口,针对不同的场景,kubernetes 为我们设置了四种 Service 的类型
- ClusterIP
- NodePort
- LoadBalancer
- ExternalName
1)ClusterIP(默认)
- 向集群内部暴露一个IP,集群内部访问的方式,外部无法访问,主要用于为集群内部的Pod访问时,提供的固定访问地址,默认自动分配地址,可使用ClusterIP关键字指定IP
1> 编写文件
cat > ClusterIP.yaml <<EOF
kind: Service
apiVersion: v1
metadata:
name: my-svc
spec:
type: ClusterIP
selector:
app: nginx
ports:
- port: 80
targetPort: 80
EOF
2> 运行测试
# 运行测试
[root@k8s-master1 yaml]# kubectl apply -f clusterip.yaml
service/my-svc created
# 获取Service信息
[root@k8s-master1 yaml]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11d
my-svc ClusterIP 10.96.222.172 <none> 80/TCP 21s
nginx NodePort 10.96.6.147 <none> 80:42550/TCP 11m
# Curl一下地址,访问成功
[root@k8s-master1 yaml]# curl 10.96.6.147
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
2)NodePort
- 在宿主主机中开启一个端口与负载均衡IP的端口一一对应,外界可以使用宿主主机的端口访问集群内部服务。
1> 编写文件
cat > nodeport.yaml <<EOF
kind: Service
apiVersion: v1
metadata:
name: my-svc
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080
EOF
2> 运行测试
# 运行测试
[root@k8s-master1 yaml]# kubectl apply -f nodeport.yaml
service/my-svc created
# 获取状态
[root@k8s-master1 yaml]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11d
my-svc NodePort 10.96.159.234 <none> 80:30080/TCP 12s
nginx NodePort 10.96.6.147 <none> 80:42550/TCP 17m
# Curl一下地址,访问成功
[root@k8s-master1 yaml]# curl 192.168.12.71:30080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
3)LoadBalancer
- 是实现暴露服务的另一种解决方案,它依赖于公有云弹性IP实现
1> 编写文件
cat > nginx.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
name: loadbalancer
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 80
selector:
app: nginx
EOF
2> 运行测试
# 运行测试
[root@k8s-master1 yaml]# kubectl apply -f LoadBalancer.yaml
service/my-svc created
# 获取状态
[root@kubernetes-node-01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 110d
loadbalancer LoadBalancer 10.0.129.18 81.71.12.240 80:30346/TCP 11s
4)ExternalName(外部名)
- ExternalName:将其他链接设置一个集群内部的别名,与service同步创建、同步删除。
- 是Service的一个特例,没有选择器,也没有定义端口、Endpoints(端点),作用是返回集群外Service的外部别名,将外部地址经过集群内部的再一次封装,实际上就是集群DNS服务器将cname(地名)解析到了外部地址上,从而实现了集群内部访问。
- 例如你们公司的镜像仓库,最开始是用 ip 访问,等到后面域名下来了再使用域名访问;你不可能去修改每处的引用,但是可以创建一个 ExternalName,首先指向到 ip,等后面再指向到域名。
1> 编写文件
kind: Service
apiVersion: v1
metadata:
name: my-svc
spec:
type: ExternalName
externalName: www.baidu.com
六、控制器
-
本章节主要围绕两大功能:扩容缩容+升级回滚
-
Pod通过控制器实现应用的运维,如伸缩、升级等,控制器决定了创建pod资源的方式和类型,在集群上管理和运行容器的对象通过label-selector 相关联。
-
控制器又称之为工作负载,分别包含以下类型控制器:
- Deployment
- Daemonset
- Statufluset
- Job
- CronJob
1.Deployment
- Deployment主要是保证有足够的Pod正常对外提供服务。
- 特点:
- 部署无状态应用,只关心数量,不论角色等,称无状态
- 管理Pod和ReplicaSet
- 具有上线部署、副本设定、滚动升级、回滚等功能
- 提供声明式更新,例如只更新一个新的image
- 应用场景:
- web 服务
1)代码部署
1> 代码部署案例
cat > deployment.yaml <<EOF
apiVersion: apps/v1 #kubectl explain deployment查看deployment版本号:apps/v1
kind: Deployment #类型
metadata: #元数据
name: deployment #deployment的名称
spec: #定义容器的详细信息
replicas: 1 #创建Pod的副本数
selector: #标签选择器:定义Deployment 如何找到要管理的 Pod,与 template 的 label(标签)对应
matchLabels: #精确匹配
release: stable #对应Pod标签
template: #创建Pod的模板---------以下是Pod信息
metadata: #Pod元数据
name: test-tag #Pod名称(可不定义,随机生成)
labels: #标签
release: stable
spec: #定义容器详细信息
containers: #容器列表
- name: nginx
image: nginx
EOF
2> 运行部署
[root@k8s-master1 ~]# kubectl apply -f deployment.yaml
deployment.apps/deployment created
[root@k8s-master1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
deployment-5849786498-9nvhp 1/1 Running 0 5s
# 查看部署详情
[root@k8s-master1 ~]# kubectl describe deployments.apps
Name: deployment
Namespace: default
CreationTimestamp: Fri, 02 Apr 2021 19:59:13 +0800
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 1
Selector: release=stable
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: release=stable
Containers:
nginx:
Image: nginx
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: deployment-5849786498 (1/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 30m deployment-controller Scaled up replica set deployment-5849786498 to 1
2)弹性扩容、缩容三种方式
扩容:replicas 的值越大,即为扩容
缩容:replicas 的值越小,即为缩容
方式1:scale命令行指定(推荐)
[root@k8s-master1 ~]# kubectl scale deployment deployment --replicas=4
deployment.apps/deployment scaled
# 执行回车后立即生效
[root@k8s-master1 ~]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
deployment 4/4 4 4 51m
方式2:修改配置清单
1.直接编辑yaml文件进行修改
[root@k8s-master1 ~]# vim deployment.yaml
···
spec:
replicas: 3 # 修改创建Pod的副本数
selector:
···
# 等待启动,已扩容为三个
[root@k8s-master1 ~]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
deployment 3/3 3 3 37m
====================================================================================================
2.edit命令行修改配置项,同上效果一样
[root@k8s-master1 ~]# kubectl edit deployments.apps deployment
···
spec:
progressDeadlineSeconds: 600
replicas: 2
revisionHistoryLimit: 10
···
# 跟vim编辑yaml配置文件类似,已缩容为2个
[root@k8s-master1 ~]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
deployment 2/2 2 2 46m
方式3:打标签指定
[root@k8s-master1 ~]# kubectl patch deployments.apps deployment -p '{"spec":{"replicas":6}}'
deployment.apps/deployment patched
[root@k8s-master1 ~]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
deployment 6/6 6 6 56m
3)升级、降级三种方式
-
降级即为回滚
-
前提:存在低版本的情况下才可升级
-
准备低版本配置文件
cat > update_test.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: django
spec:
replicas: 1
selector:
matchLabels:
app: stable
template:
metadata:
label:
app:stable
spec:
containers:
- name: nginx1
image: nginx:1.17.10
EOF
- 运行pod并查看当前版本
- 以下三种升降级都基于此1.17.0版本举例测试
# 运行pod查看状态
[root@k8s-master1 ~]# kubectl apply -f update_nginx.yaml
deployment.apps/django created
[root@k8s-master1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
django-54bb9d4cd6-b47km 1/1 Running 0 2m19s
#监控并进入容器查看当前版本号
[root@k8s-master1 ~]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
django-54bb9d4cd6-b47km 1/1 Running 0 116s
# 当前版本号为1.17.0
[root@k8s-master1 ~]# kubectl exec -it django-54bb9d4cd6-b47km bash
root@django-54bb9d4cd6-b47km:/# nginx -v
nginx version: nginx/1.17.10
方式1:set image命令行(推荐)
- kubectl set resources:
- 可用资源对象包括(支持大小写):replicationcontroller、deployment、daemonset、job、replicaset
- PS:指定文件中的 kind/name,tab键补不出来
1.升级
#升级到1.18.0
[root@k8s-master1 ~]# kubectl set image Deployment/django nginx1=nginx:1.18.0
deployment.apps/django image updated
# 升级成功
root@django-5c6cfdc7bb-bk644:/# nginx -v
nginx version: nginx/1.18.0
# 查看运行状态
[root@k8s-master1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
django-5c6cfdc7bb-bk644 1/1 Running 0 114s
2.降级
- 同上,将版本号修改为低即可,略~
方式2:修改配置清单
- 此方式是直接在命令行进入配置清单来修改
- 同vim来编辑配置清单是一样的,不过vim需要apply -f重载,这里不用!
1.升级
[root@k8s-master1 ~]# kubectl edit deployments.apps django
···
spec:
containers:
- image: nginx:1.17.0 # 修改此处版本号
imagePullPolicy: IfNotPresent
name: nginx1
···
deployment.apps/django edited # 保存后提示编辑成功
# 进入容器查看版本
[root@k8s-master1 ~]# kubectl exec -it django-6cf8df464c-6rp72 bash
root@django-6cf8df464c-6rp72:/# nginx -v
nginx version: nginx/1.17.0
============================================或============================================
# 或用vim修改
[root@k8s-master1 ~]# vim update_nginx.yaml
containers:
- name: nginx1
image: nginx:1.18.0
# vim需重载更新
[root@k8s-master1 ~]# kubectl apply -f update_nginx.yaml
deployment.apps/django configured
[root@k8s-master1 ~]# kubectl exec -it django-5c6cfdc7bb-h98xf bash
root@django-5c6cfdc7bb-h98xf:/# nginx -v
nginx version: nginx/1.18.0
2.降级
- 同上,将版本号修改为低即可,略~
方式3:打标签
- 此方式较啰嗦,故不推荐
1.升级
# 执行升级命令
[root@k8s-master1 ~]# kubectl patch deployments.apps django -p '{"spec":{"template":{"spec":{"containers":[{"image":"nginx:1.18.0","name":"nginx"}]}}}}'
deployment.apps/django patched # 正在修补
# 实时监控
[root@k8s-master1 ~]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
django-6c5b55f69f-m72nc 0/2 ContainerCreating 0 0s
django-54bb9d4cd6-b47km 0/1 Terminating 0 18m
django-6c5b55f69f-m72nc 1/2 Error 0 16s
django-6c5b55f69f-m72nc 2/2 Running 1 17s
# 查看状态运行成功
[root@k8s-master1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
django-6c5b55f69f-vghvf 2/2 Running 3 62s
# 进入容器查看版本,升级成功
root@django-6c5b55f69f-m72nc:/# nginx -v
nginx version: nginx/1.18.0
2.降级
- 同上,将版本号修改为低即可,略~
2.SatefulSet
-
在集群中所有的节点上部署只部署一个Pod,删除节点自动删除对应得Pod
-
特点:
- 部署有状态应用,每台上有且只有一个,不能扩容
- 解决Pod独立生命周期,保持Pod启动顺序和唯一性
- 稳定,唯一的网络标识符,持久存储(例如: etcd 配置文件,节点地址发生变化,将无法使用)
- 有序,优雅的部署和扩展、删除和终止(例如: mysql 主从关系,先启动主,再启动从)
- 有序,滚动更新
-
应用场景
- 数据库
-
有状态和无状态的区别
- 无状态:
1)deployment认为所有的pod都是一样的
2)不用考虑顺序的要求
3)不用考虑在哪个node节点上运行
4)可以随意扩容和缩容 - 有状态:
1)实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd, zookeeper
2)实例之间不对等的关系,以及依靠外部存储的应用。
- 无状态:
-
常规service和无头服务区别
- service: 一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
- Headless service:无头服务,不需要cluster-IP,直接绑定具体的Pod的IP(当Pod的IP地址是动态变化时,所以常用于绑定DNS访问
-
StatefulSet与Deployment区别:
- StatefulSet创建的pod是有身份的!
- 身份三要素:
域名 nginx-statefulset-0.nginx
主机名 nginx-statefulset-0
存储 (PVC)
- 身份三要素:
- StatefulSet创建的pod是有身份的!
查看版本号
[root@k8s-master1 ~]# kubectl explain DaemonSet|grep -i version
VERSION: apps/v1
编写配置清单
cat > php.yaml <<EOF
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: php
spec:
selector:
matchLabels:
app: php
template:
metadata:
labels:
app: php
spec:
containers:
- name: php
image: php:7.1-fpm
EOF
查看当前版本
# 当前版本为7.1
[root@k8s-master1 ~]# kubectl exec -it php-c8jck bash
root@php-c8jck:/var/www/html# php -v | grep PHP
PHP 7.1.33 (cli) (built: Nov 22 2019 18:34:33) ( NTS )
# 两台node节点各自动部署了一个
[root@k8s-master1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
php-c8jck 1/1 Running 0 18m
php-x8kbh 1/1 Running 0 18m
方式1:set image命令行(推荐)
1.升级
# 节点1升级成功
[root@k8s-master1 ~]# kubectl set image daemonset/php php=php:7.4-fpm
[root@k8s-master1 ~]# kubectl exec -it php-92h98 bash
root@php-92h98:/var/www/html# php -v
PHP 7.4.14 (cli) (built: Jan 12 2021 02:26:27) ( NTS )
# 节点2升级成功
[root@k8s-master1 ~]# kubectl exec -it php-rszf8 bash
root@php-rszf8:/var/www/html# php -v
PHP 7.4.14 (cli) (built: Jan 12 2021 02:26:27) ( NTS )
2.降级
- 同上,将版本号修改为低即可,略~
方式2:edit修改配置
1)升级
[root@k8s-master1 ~]# kubectl edit daemonsets.apps php
- image: php:7.3-fpm # 修改为7.3
imagePullPolicy: IfNotPresent
name: php
daemonset.apps/php edited # 提示修改成功
# 节点1升级成功
[root@k8s-master1 ~]# kubectl exec -it php-4xgkr bash
root@php-4xgkr:/var/www/html# php -v
PHP 7.3.26 (cli) (built: Jan 12 2021 02:54:23) ( NTS )
# 节点2升级成功
[root@k8s-master1 ~]# kubectl exec -it php-j24m6 bash
root@php-j24m6:/var/www/html# php -v
PHP 7.3.26 (cli) (built: Jan 12 2021 02:54:23) ( NTS )
2)降级
- 同上,将版本号修改为低即可,略~
方式3:打标签
- 此方式较啰嗦,故不推荐
1.升级
# 升级到7.1
[root@k8s-master1 ~]# kubectl patch daemonsets.apps php -p '{"spec":{"template":{"spec":{"containers":[{"image":"php:7.4-fpm", "name":"php"}]}}}}'
# node1升级成功
[root@k8s-master1 ~]# kubectl exec -it php-5g7z7 bash
root@php-5g7z7:/var/www/html# php -v
PHP 7.4.14 (cli) (built: Nov 22 2019 18:34:33) ( NTS )
# node2升级成功
[root@k8s-master1 ~]# kubectl exec -it php-6kvdl bash
root@php-6kvdl:/var/www/html# php -v
PHP 7.4.14 (cli) (built: Nov 22 2019 18:34:33) ( NTS )
2.降级
同上,将版本号修改为低即可,略~