命令行资源创建的基本操作命令
//创建一个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进行替换。
———————— 本文至此结束,感谢阅读 ————————