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
更新镜像
kubectl set image deployment nginx-deploy nginx=nginx:1.20-alpine

deployment查看历史版本
kubectl rollout history deployment nginx-deployment

deployment 回滚到之前的版本

kubectl rollout undo deployment nginx-deploy

kubectl describe deployment nginx-deploy
yaml格式查看
kubectl get deployment nginx-deploy -o yaml
修改deployment
kubectl edit 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中的元数据来查找目标资源,如果没有的话则直接新建,如果找到的话就依次比对配置文件之间有什么不同点,然后应用不同的配置。

复制代码
连接POD

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
posted @   ianCloud  阅读(122)  评论(0编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
点击右上角即可分享
微信分享提示