k8s资源的创建方式之命令行&资源清单(yaml)
更新:HHH   时间:2023-1-7


命令行资源创建的基本操作命令

//创建一个deployment资源对象。(pod控制器)
[root@master ~]# kubectl  run test --image=httpd --port=80 --replicas=2 
//删除控制器:
[root@master ~]# kubectl  delete deployments. test
//删除所有pod:
[root@master ~]# kubectl  delete deployments. --all 
//查看deployment资源对象 
[root@master ~]# kubectl get deployments.
//查看pod运行在哪个节点之上
[root@master ~]# kubectl get pod -o wide
//查看service映射出来的资源对象
[root@master ~]# kubectl get svc
//查看一个资源(service)的详细信息。
[root@master ~]# kubectl  describe svc test 
//删除资源对象:
[root@master ~]#kubectl delete services test
//查看deployment资源的详细信息:
[root@master ~]# kubectl  describe  deployments. test-web
//查看一个pod的详细信息:
[root@master ~]# kubectl  describe  pod test-web-8697566669-52tq
//查看replicas的详细信息
[root@master ~]# kubectl get replicasets.
replicas:和controller manager都是一种控制器
//编辑一个资源对象(servie,pod,namespace都可以进行编辑):
[root@master ~]# kubectl  edit  deployments. test-web  

//把输出json格式的信息导入(转为)yaml格式的文本中:(反之也是相同的)
[root@master ~]#  kubectl  get  deployments. test-web -o json > test2.yaml

服务的扩容与缩容

方法一:命令行的方式:

1)创建一个deployment的资源对象:
[root@master ~]# kubectl run test --image=httpd --port=80 --replicas=2 
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/test created
//回车后会有正常提示(如上所示),提示这种deployment控制器会在将来的版本中移除,以后会有pod来代替。
[root@master ~]# kubectl  get deployments.  -o wide  
NAME   READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES   SELECTOR
test   2/2     2            2           68s   test         httpd    run=test

2)进行扩容操作

//将资源对象的副本扩容为4个:
[root@master ~]# kubectl scale deployment test --replicas=4
deployment.extensions/test scaled

//查看是否扩容成功:

[root@master ~]# kubectl  get deployments. -o wide
NAME   READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES   SELECTOR
test   4/4     4            4           3m40s   test         httpd    run=test

3)进行缩容操作(跟扩容相同,减少即可)

//将资源对象的副本缩容为3个:
[root@master ~]# kubectl  scale deployment  test --replicas=3
deployment.extensions/test scaled
[root@master ~]# kubectl  get deployments. -o wide
NAME   READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES   SELECTOR
test   3/3     3            3           7m14s   test         httpd    run=test

方法二:也可以利用edit编辑器:

//将该deployment的副本数量扩容为4个:
[root@master ~]# kubectl  edit deployments. test 

//再次查看副本数量,已经扩容成功:
[root@master ~]# kubectl  get deployments. -o wide
NAME   READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES   SELECTOR
test   4/4     4            4           11m   test         httpd    run=test

服务的更新与回滚

1)搭建registry私有仓库,上传自定义镜像:
搭建私有仓库过程略,可以参考之前的博文点击链接。

//镜像重命名:
[root@master ~]# docker tag nginx:latest 172.16.1.30:5000/nginx:v1.0
[root@master ~]# docker tag nginx:latest 172.16.1.30:5000/nginx:v2.0
[root@master ~]# docker tag nginx:latest 172.16.1.30:5000/nginx:v3.0
//上传镜像:
[root@master ~]# docker push 172.16.1.30:5000/nginx:v1.0 
[root@master ~]# docker push 172.16.1.30:5000/nginx:v2.0 
[root@master ~]# docker push 172.16.1.30:5000/nginx:v3.0 

2)创建一个deployment:
[root@master ~]# kubectl run mynginx --image=172.16.1.30:5000/nginx:v1.0 --replicas=4

//查看镜像版本信息:
[root@master ~]# kubectl  get deployments. -o wide
NAME      READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES                        SELECTOR
mynginx   4/4     4            4           4m51s   mynginx      172.16.1.30:5000/nginx:v1.0   run=mynginx

##如果pod没有正常运行,排错思路:

1,通过describe命令进行查看详细信息。
[root@master ~]# kubectl  describe pod bdqn-web-7ff466c8f5-p6wcw 
2,通过查看kubelet的日志信息。
 [root@master ~]# cat /var/log/messages | grep kubelet

更新服务的镜像版本

//更新镜像为nginx:v2.0
[root@master ~]# kubectl set image deployment mynginx mynginx=172.16.1.30:5000/nginx:v2.0
deployment.extensions/mynginx image updated
//查看是否更新成功:
[root@master ~]# kubectl  get deployments. -o wide
NAME      READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                        SELECTOR
mynginx   4/4     4            4           11m   mynginx      172.16.1.30:5000/nginx:v2.0   run=mynginx

可以看到镜像已经更新成功。

##############方法二:同样可以通过edit编辑器进行修改:

//将镜像版本更新为nginx:v3.0
[root@master ~]# kubectl  edit  deployments. mynginx 

//保存退出后(与vim编辑器操作相同),查看镜像版本:
[root@master ~]# kubectl  get deployments. -o wide
NAME      READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                        SELECTOR
mynginx   4/4     4            4           16m   mynginx      172.16.1.30:5000/nginx:v3.0   run=mynginx

进行回滚镜像操作

//执行回滚操作:
[root@master ~]# kubectl  rollout  undo deployment  mynginx 
deployment.extensions/mynginx rolled back
[root@master ~]# kubectl  get deployments. -o wide  #可以看到已经回滚成功
NAME      READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                        SELECTOR
mynginx   4/4     4            4           18m   mynginx      172.16.1.30:5000/nginx:v2.0   run=mynginx
//二次执行回滚操作:
[root@master ~]# kubectl  rollout  undo deployment  mynginx 
deployment.extensions/mynginx rolled back
//查看回滚后的镜像版本:
[root@master ~]# kubectl  get deployments. -o wide
NAME      READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                        SELECTOR
mynginx   4/4     4            4           20m   mynginx      172.16.1.30:5000/nginx:v3.0   run=mynginx

可以很清楚的看到,k8s默认的回滚操作跟docker swarm集群的是一样,只在前后两个版本之间进行回滚。

资源的传创建方式之资源清单(yaml)

创建资源清单必须要知道并且记住以下几个必写的一级字段:

  • apiVersion: api的版本
  • kind:要创建的资源对象的类型
  • metadata:元数据。(描述资源对象的基本信息)其中name字段是必写字段。
  • spec:描述用户期望的状态。container和image字段是必写字段,container------>image.
  • status: 现在pod所处的状态。(随着pod容器的运行自动生成的)
1,查看api所有的版本:(每个版本都有各自的功能,当然你还可以自己添加版本)
[root@master ~]# kubectl  api-versions

admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
apps/v1beta1
apps/v1beta2
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1
coordination.k8s.io/v1beta1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
networking.k8s.io/v1beta1
node.k8s.io/v1beta1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1

2,帮助你编写yaml文件的工具(explain):
一定要用熟悉,非常有用。

//比如创建pod,需要用到那些字段以及对应的版本和提示:
[root@master ~]# kubectl  explain  pod 

//查看帮助deployment的metadata字段是怎样写的:
[root@master ~]# kubectl  explain  deploy.metadata  #部分资源对象名可以简写,也可以补全


它会给予一些相对应的子字段,比如name名称,namespace名称空间等。
3,接下来我们编写一个简单的部署nginx的yaml文件
提示:编写yaml文件时一定要注意格式(缩进)
[root@master yaml]# vim nginx.yaml #注意,要以.yaml结尾

kind: Deployment        #类型为deployment
apiVersion: extensions/v1beta1   #对应的版本为v1beta1
metadata:
  name: nginx-deploy     #定义该资源对象的名称
spec:
  replicas: 2                   #副本数量为2
  template:                  #定义模板
    metadata:              
      labels:                  #在模板中定义标签,标签的作用用于后面连接service使用
        app: web-server     
    spec:
      containers:
      - name: nginx        #定义pod名称(自定义)
        image: nginx     #指定镜像
//运行yaml文件:(有以下两种方法)
[root@master yaml]# kubectl apply -f  nginx.yaml    #推荐使用该种方法
deployment.extensions/nginx-deploy created

或者:
[root@master yaml]# kubectl create nginx.yaml

//查看pod是否运行成功:
[root@master yaml]# kubectl  get pod 
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-56558c8dc7-pjdkk   1/1     Running   0          117s
nginx-deploy-56558c8dc7-rxbpb   1/1     Running   0          117s
//如果需要通过yaml文件将资源对象进行删除:
[root@master yaml]# kubectl  delete -f  nginx.yaml 
deployment.extensions "nginx-deploy" deleted

该种方法也是常用的,不用自己手动去一个一个的将pod删除。

4,创建一个service的资源对象,用于关联上述的deployment
service的作用主要用于提供一个访问服务的统一接口。k8s集群维护service和endpoint的映射关系。

//编写service的yaml文件:
[root@master yaml]# vim nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  type: NodePort  #定义service的类型为nodeport
  selector:          #标签选择器,用于关联deployment
    app: web-server     #注意,该标签必须要deployment的标签一致,不然无法与deployment进行关联    
  ports:         #定义端口
  - protocol: TCP     #协议为TCP
    port: 8080            #定义cluster ip对应的端口
    targetPort: 80    #定义容器内的端口
        nodePort: 30000    #暴露给外网的端口

//执行yaml文件:
[root@master yaml]# kubectl apply -f nginx-svc.yaml
service/nginx-svc created

//查看service的信息:

解释:
service默认为Cluster ip的类型。Cluster ip仅支持集群内部的访问,且集群内部每一个节点都可以通过该ip地址相互访问。
而nodeport的类型是暴露给外网的端口,外网可以通过宿主机的ip地址+映射的端口来进行访问。

//测试访问nginx页面:

设置master节点参加工作:

我们k8s架构中知道,集群中的master节点默认是不参加工作的,如果需要master参加工作,该怎么做呢?

1)执行以下命令设置处于工作状态:
[root@master yaml]# kubectl  taint node master node-role.kubernetes.io/master-
node/master untainted
2)修改上面的yaml文件,将副本数量改为3个。
[root@master yaml]# vim nginx.yaml 
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: nginx-deploy
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: web-server
    spec:
      containers:
      - name: nginx
        image: nginx
3)重新执行yaml文件:
[root@master yaml]# kubectl  apply -f  nginx.yaml 
deployment.extensions/nginx-deploy configured
4)验证pod会分配给master:(默认是不会分配给master的)
[root@master yaml]# kubectl  get pod -o wide


可以看到会均匀的分配给集群中每个节点,以实现负载均衡

恢复master节点(不参加工作)

[root@master yaml]# kubectl  taint node master node-role.kubernetes.io/master="":NoSchedule
node/master tainted
//重新运行yaml文件,查看pod是否还会分配给master
[root@master yaml]# kubectl  delete -f  nginx.yaml 
deployment.extensions "nginx-deploy" deleted
[root@master yaml]# kubectl apply -f  nginx.yaml 
deployment.extensions/nginx-deploy created

注意:我这上面的pod,已经是新的pod了,跟docker swarm一样,原来分配在master上的pod还会存在,只是后生成的pod会随机分配给其他节点。

指定pod运行的节点位置

我们知道pod是通过kube-proxy组件随机分配给节点的,但如果要指定pod运行在哪个节点上,该怎么做?
跟docker swarm一样,我们可以通过给节点打标签的方式来实现。

1)//定义标签:
[root@master yaml]# kubectl  label nodes node01 test=123  #标签自定义
node/node01 labeled
//如果要删除标签:
[root@master yaml]# kubectl  label nodes node01 disktype-
2)//验证节点标签,并显示它们的标签状态:
[root@master yaml]# kubectl  get nodes  --show-labels 


我们查看node01,可以查看到刚刚定义的标签。

3)//修改yaml文件:
[root@master yaml]# vim nginx.yaml 
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: nginx-deploy
spec:
  replicas: 6
  template:
    metadata:
      labels:
        app: web-server
    spec:
      containers:
      - name: nginx
        image: nginx
      nodeSelector:     #添加节点选择器
        test: '123'        #指定刚刚自定义的标签,如果有数字则需要用单引或者双引号括起来
//重新执行yaml文件:
[root@master yaml]# kubectl apply -f  nginx.yaml 
deployment.extensions/nginx-deploy configured
4)//查看pod是否会运行在指定的node01上:
[root@master yaml]# kubectl  get pod -o wide 


注意:会将原来运行在该节点上的pod进行替换。

———————— 本文至此结束,感谢阅读 ————————

返回云计算教程...