k8s使用
创建/删除命名空间
[root@master ~]# kubectl create namespace test1
namespace/test1 created
[root@master ~]# kubectl delete namespace test1
namespace "test1" deleted
创建deplyment nginx
kubectl create deployment nginx-deploy --image=nginx:1.21-alpine --replicas=1
kubectl expose deployment nginx-deploy --port=80 --type=NodePort
修改端口
kubectl edit svc nginx-deploy
调整副本数
kubectl patch deployment nginx-deploy -p '{"spec":{"replicas":2}}'
# 动态扩展副本数量为5个
kubectl scale --replicas=5 deployment
nginx-deploy# 缩减为3个
kubectl scale --replicas=2 deployment
nginx-deploy使用autoscale还可设置自动水平扩展(hpa),可根据机器负载之类的信息自动扩展或缩减,这个后面细讲
$ kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80
deployment "nginx-deployment" autoscaled
deployment查看历史版本
kubectl rollout history deployment nginx-deployment
deployment 回滚到之前的版本
kubectl rollout undo deployment nginx-deploy
7 ) 编辑服务的 type: ClusterIP ==》type: NodePort
[root@k8s6 ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes NodePort 10.96.0.1 <none> 443:31234/TCP 38h nginx ClusterIP 10.107.169.145 <none> 80/TCP 20s [root@k8s6 ~]# kubectl edit svc nginx type: ClusterIP ==》type: NodePort [root@k8s6 ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes NodePort 10.96.0.1 <none> 443:31234/TCP 39h nginx NodePort 10.107.169.145 <none> 80:31986/TCP 51m
kubectl apply 应用配置!上一节我们知道了一个简单快捷的编辑配置方法kubectl edit
,但是如果我们想对资源进行大范围的修改呢?总不能打开配置项一个一个手动修改吧。这时候就可以用到我们的kubectl apply
命令了。基本用法如下:
kubectl apply -f <新配置文件名.yaml>
kubeclt apply
可以说是edit
命令的升级版,它和edit
最大的区别就是,apply
接受一个yaml
配置文件,而不是打开一个编辑器去修改。k8s 在接受到这个配置文件后,会根据metadata
中的元数据来查找目标资源,如果没有的话则直接新建,如果找到的话就依次比对配置文件之间有什么不同点,然后应用不同的配置。
kubectl exec -it nginx-deploy-8588f9dfb-jfkbz -- /bin/bash
root@nginx-deploy-8588f9dfb-jfkbz:/# nginx -v
nginx version: nginx/1.21.1
root@nginx-deploy-8588f9dfb-jfkbz:/#
查看状态
kubectl get pod,svc -o wide

访问试一下
http://10.254.193.115:32007/
效果
作者:baozixiaoge
链接:https://www.jianshu.com/p/952e64e89987
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
创建Deployment
如下一个Deployment的配置(nginx-deployment.yaml),创建一个ReplicaSet包含3个nginx Pods
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
- apiVersion这里为apps/v1,如果是1.9之前的版本为extensions/v1beta1
- replicas:3 起3个replicated Pods
- selector指明哪个pod被管理,这里我们指定了label(app:nginx)
- template: spec 指明了运行一个容器nginx(以nginx:1.7.9为镜像)
- 开放80端口给container,以使container之间能发送和接收流量
-
① apiVersion 是当前配置格式的版本。
先执行kubectl api-resources找到所有的资源
在执行命令 kubectl explain deploy即可获取到版本和类型信息
② kind 是要创建的资源类型,这里是 Deployment。
③ metadata 是该资源的元数据,name 是必需的元数据项。
④ spec 部分是该 Deployment 的规格说明。
⑤ replicas 指明副本数量,默认为 1。
⑥ template 定义 Pod 的模板,这是配置文件的重要部分。
⑦ metadata 定义 Pod 的元数据,至少要定义一个 label。label 的 key 和 value 可以任意指定。
⑧ spec 描述 Pod 的规格,此部分定义 Pod 中每一个容器的属性,name 和 image 是必需的。
注意这里定义name 或 label 时不要和其他的重复,k8s不会检查这个,需要人工自己确认
要创建此部署,执行下面的命令(在这之前我们提前下好nginx相关的镜像,docker pull nginx:1.7.9)
[root@master yaml]# kubectl create -f nginx-deployment.yaml --record
deployment "nginx-deployment" created
- --record会记录操作历史,以便于后面回滚操作
查看deployments
[root@master yaml]# kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 0 0 0 1s
- NAME:在集群中的部署名称
- DESIRED:显示配置里定义的副本数量,这是应该达到的副本数量
- CURRENT:当前正在运行的副本数量
- UP-TO-DATE:更新到当前所需状态的副本数量
- AVAILABLE:可供使用的副本数量
- AEG:显示app存活的时间
通过下面语句可查追踪部署情况
[root@master ~]# kubectl rollout status deployment/nginx-deployment
deployment "nginx-deployment" successfully rolled out
# 这是部署完成的状态
# 未完成的会显示当前部署哪一步了
[root@master ~]# kubectl rollout status deployment/nginx-deployment
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment "nginx-deployment" successfully rolled out
过一会我们再查看,就全
[root@master ~]# kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 3 3 3 51s
回滚Deployment
有时需要回滚的操作,比如更新错误,手误等一系列问题
比如上面的操作更新到1.9.1时,写错了,写成1.91了
[root@master yaml]# kubectl set image deployment/nginx-deployment nginx=nginx:1.91
deployment "nginx-deployment" image updated
追踪状态
[root@master yaml]# kubectl rollout status deployments nginx-deployment
Waiting for rollout to finish: 1 out of 3 new replicas have been updated...
可见卡住不动了, Ctrl+C终止,查看rs如下
[root@master yaml]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-5964dfd755 3 3 3 40m
nginx-deployment-5d5cfdbd5f 1 1 0 1m
nginx-deployment-6c54bd5869 0 0 0 2h
新的rs只启动了Pod但没有处于READY状态
查看Pods
[root@master yaml]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-5964dfd755-8z8b7 1/1 Running 0 27m
nginx-deployment-5964dfd755-bnznj 1/1 Running 0 27m
nginx-deployment-5964dfd755-pt54q 1/1 Running 0 27m
nginx-deployment-5d5cfdbd5f-srdcc 0/1 ImagePullBackOff 0 2m
可发现ImagePullBackOff,实际就是镜像不存在
要修复这个,我们就需要rollback到前一个ok的版本
查看操作历史
[root@master yaml]# kubectl rollout history deployment/nginx-deployment
deployments "nginx-deployment"
REVISION CHANGE-CAUSE
1 kubectl create -f docs/user-guide/nginx-deployment.yaml --record
2 kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
3 kubectl set image deployment/nginx-deployment nginx=nginx:1.91
要查看每个版本的详细情况,指定--revision
[root@master yaml]# kubectl rollout history deployment/nginx-deployment --revision=2
deployments "nginx-deployment" with revision #2
Pod Template:
Labels: app=nginx
pod-template-hash=2710681425
Annotations: kubernetes.io/change-cause=kubectl edit deployment/nginx-deployment
Containers:
nginx:
Image: nginx:1.9.1
Port: 80/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
接下来进行回滚的操作
不指定版本,默认回滚到上一个版本
[root@master yaml]# kubectl rollout undo deployment/nginx-deployment
deployment "nginx-deployment" rolled back
指定版本,通过--to-revision指定
[root@master yaml]# kubectl rollout undo deployment/nginx-deployment --to-revision=2
deployment "nginx-deployment" rolled back
查看
kubectl describe deployment/nginx-deployment
....略
Events:
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
30m 30m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-2035384211 to 3
29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 1
29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 2
29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 2
29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 0
29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-3066724191 to 2
29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-3066724191 to 1
29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-1564180365 to 2
2m 2m 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-3066724191 to 0
2m 2m 1 {deployment-controller } Normal DeploymentRollback Rolled back deployment "nginx-deployment" to revision 2
29m 2m 2 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 3
可看到有DeploymentRollback Reason的事件
部署service
服务的暴露需要Service,它是Pod的抽象代理(具体机制见这里)。见nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
sessionAffinity: ClientIP
selector:
app: nginx
ports:
- port: 80
nodePort: 30080
- kind:Service代表是一个服务
- type:NodePort k8s将会在每个Node上打开一个端口并且每个Node的端口都是一样的,通过<NodeIP>:NodePort的方式Kubernetes集群外部的程序可以访问Service。
- selector:哪个服务需要暴露
- port:service暴露的端口
- TargetPort:pod的端口
- nodePort:对外暴露的端口,不设置会默认分配,范围:30000-32767
- 转发逻辑是:
<NodeIP>:<nodeport> => <ServiceVIP>:<port>=> <PodIP>:<targetport>
部署service服务:
[root@master yaml]# kubectl create -f nginx-service.yaml
service "nginx-service" created
补充:移除NODE节点的方法
第一步:先将节点设置为维护模式(host1是节点名称)
[root@ken ~]# kubectl drain host1 --delete-local-data --force --ignore-daemonsets node/host1 cordoned WARNING: Ignoring DaemonSet-managed pods: kube-flannel-ds-amd64-ssqcl, kube-proxy-7cnsr node/host1 drained
第二步:然后删除节点
[root@ken ~]# kubectl delete node host1 node "host1" deleted
第三步:查看节点
发现host1节点已经被删除了
[root@ken ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION host2 Ready <none> 13m v1.13.2 ken Ready master 49m v1.13.2
如果这个时候再想添加进来这个node,需要执行两步操作
第一步:停掉kubelet(需要添加进来的节点操作)
[root@host1 ~]# systemctl stop kubelet
第二步:删除相关文件
[root@host1 ~]# rm -rf /etc/kubernetes/*
第三步:添加节点
[root@host1 ~]# kubeadm join 172.20.10.2:6443 --token rn816q.zj0crlasganmrzsr --discovery-token-ca-cert-hash sha256:e339e4dbf6bd1323c13e794760fff3cbeb7a3f6f42b71d4cb3cffdde72179903
第四步:查看节点
[root@ken ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION host1 Ready <none> 13s v1.13.2 host2 Ready <none> 17m v1.13.2 ken Ready master 53m v1.13.2
忘掉token再次添加进k8s集群
第一步:主节点执行命令
获取token
[root@ken-master ~]# kubeadm token list TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS ojxdod.fb7tqipat46yp8ti 10h 2019-05-06T04:55:42+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
第二步: 获取ca证书sha256编码hash值
[root@ken-master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' 2f8888cdb01191ff6dbca0edb02dbb21a14469028e4ff2598854a4544c5fa751
第三步:从节点执行如下的命令
[root@ken-node1 ~]# systemctl stop kubelet
第四步:删除相关文件
[root@ken-node1 ~]# rm -rf /etc/kubernetes/*
第五步:加入集群
指定主节点IP,端口是6443
在生成的证书前有sha256:
[root@ken-node1 ~]# kubeadm join 192.168.64.10:6443 --token ojxdod.fb7tqipat46yp8ti --discovery-token-ca-cert-hash sha256:2f8888cdb01191ff6dbca0edb02dbb21a14469028e4ff2598854a4544c5fa751
转自:https://www.cnblogs.com/kenken2018/p/10332648.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器