K8S教程(4)kubectl与集群管理常用命令
一、了解K8S的配置流程在K8S中Pod是最小的工作单元,要让Pod进行工作需要遵守的大概流程:1、使用配置清单调用控制器创建并启动一个或多个POD(这些POD都有自己的IP,通过ipvs自动生成访问规则让集群内节点访问)2、控制器对Pod进行调度与状态管理,如自动重启Pod、扩充增加缩减等3、为Pod创建Service供外部访问(Service的简称,可以理解为访问入口或调度器)4、如果需要七层
一、了解K8S的配置流程
在K8S中Pod是最小的工作单元,要让Pod进行工作需要遵守的大概流程:
1、使用配置清单调用控制器创建并启动一个或多个POD(这些POD都有自己的IP,通过ipvs自动生成访问规则让集群内节点访问)
2、控制器对Pod进行调度与状态管理,如自动重启Pod、扩充增加缩减等
3、为Pod创建Service供外部访问(Service的简称,可以理解为访问入口或调度器)
4、如果需要七层代理,还需要Ingress的配合
在K8S集群中API server是唯一的管理入口,而要连接该入口对集群进行管理就需要用到kubectl这个客户端工具。kubectl工具根据命令的作用划分了几个子类,比如Begginer Commands代表基础命令,Advanced Commands高级命令、Cluster Management Commands集群管理命令、Deploy Commands部署命令等分类,每个分类下又包含了很多子命令。这些命令虽然支持简写,但是简写不能直观的看出在操作什么,而全称又太难记忆,所以可以安装命令补全工具
yum install bash-completion
二、kubectl集群管理相关命令
kubectl支持的子命令比较多,各个子命令还有简写形式,忘了的话可以参考K8S官网文档,写得非常详细:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#-strong-getting-started-strong-、https://kubernetes.io/docs/reference/kubectl/overview/,也可以使用以下命令查看:
kubectl api-resources
#shotnames对应的是简写
#namespaced里如果是true代表需要指定namespace来进行查看,否则是默认namespace
kubectl命令格式:
kubectl [command] [type] [name] -o <outfile_format>
# command:常用create、get、delete、describe、apply、run
# type:常用pods、deployment、services、namespace
# -o:指定输出格式,如wide、yaml
kubectl命令示例:
1、查看kubectl的版本
kubectl version
2、查看K8S集群状态,包含了Master和CoreDNS对外暴露的端点地址
kubectl cluster-info
3、查询K8S集群节点状态
kubectl get nodes
4、查看K8S集群组件健康状态
kubectl get cs #全写是kubectl get componentstatuses
5、查看K8S集群中已部署的控制器信息
kubectl get deployment #查看默认名称空间下的控制器
kubectl get deployment -n nginx-ingress #查看指定名称空间下的控制器
6、使用kubectl get pods命令查看K8S集群中Pod信息,加-o wide让信息更完整,包含所属node、pod ip等
kubectl get pods -A #查看已经创建的pod,-A会显示所有namespace下的pods
kubectl get pods -n kube-system -o wide #n-指定namespace,否则默认是default下的pod;-o wide让显示信息更详细,包含所属node、pod的IP等
kubectl get pods --show-labels #显示pod的标签,本文后续会有标签的内容
7、使用kubectl describe命令查看K8S集群状态指定组件的详细信息,如节点内存、磁盘是否足够、网络是否正常、可建立最大pod数与已有pod情况、是否有污点不可调用等情况,也是日常排错常用命令
三、kubectl与控制器管理
在K8S中POD是最小的工作单元,它的工作流程大概是遵守通过“使用控制器创建并启动一个或多个POD(这些POD都有自己的IP,通过ipvs自动生成访问规则让集群内节点访问)”——“为POD创建SVC(Service的简称,可以理解为访问入口或调度器)”——“由SVC对POD进行调度管理,如自动重启POD”。
1、使用kubectl create命令方式创建K8S Deployment
kubectl create deployment nginx-test --image=nginx:1.7.9 --port=80 --replicas=3 #以nginx:1.7.9镜像为基础创建名为nginx-test的POD,该POD有3个副本,如果有pod被删除了会自动创建新的pod,除非加上--restart=Never选项
2、使用kubectl get命令查看创建的Deployment信息(如果是其他控制器则将deployment替换为控制器名字)
kubectl get deployment #查询已有的deployment,全写kubectl get deployments.apps
kubectl describe deployment nginx-test
3、查看K8S Pods信息,刚才创建的Deployment会创建除Pod来
kubectl get pods -o wide #wide可以显示更多信息,比如pod的ip
4、使用kubectl describe命令查看Pods详细信息,可以看到被分配到的node节点以及Pod自己的IP等信息,由于刚创建的是Nginx,所以可以顺便访问进行测试
kubectl describe pods nginx-test-565c5cc5ff-px6nw
5、使用kubectl logs命令查看K8S Pods的日志,通常和kubectl describe结合使用来排错。如果pod中只有一个容器,就不用指定容器的名字,否则还要写清楚容器的名字
kubectl logs nginx-test-565c5cc5ff-px6nw
kubectl logs lamp-565c5cc5ff-px6nw nginx #指定pod中的某个容器
6、进入K8S所创建的容器
kubectl exec -it nginx-test-565c5cc5ff-px6nw /bin/bash
7、对deployment进行扩容
kubectl scale --replicas=5 deployment nginx-test #动态调整pod数量到5个,也可以缩减
kubectl get deployment nginx-test #查看扩容结果
kubectl get pods -o wide #扩容后pod数量也会增多,每个pod都有一个ip
8、删除K8S Pod
#删除方式1——删除指定的Pod
kubectl delete pods nginx-test
#删除方式2——删除某个yaml文件中定义的资源
kubectl delete -f pod-test.yaml
四、K8S与Services管理
由于每个Pod本身都有自己的IP。为了提升访问的可靠性,会由Services将服务进行暴露,通过VIP采用负载均衡的形式去访问后端的Pod。这些Pod可以由Label标签进行分组,Service通过标签选择器来对合适的Pod进行操作。在进行服务暴露的时候有多个类型的Services可以选择:
· ClusterIP:默认类型,可以实现本机或者Pod之间互访,但是外部无法访问,即便是宿主机也无法通过该IP访问
· NodePort:将服务暴露给外部使用,它会生成一个每个Node都可以访问的地址
· LoadBalancer:虽然NodePort已经可以对外暴露服务供用户访问,但是由于Node状态可能发生变化,为了防止用户习惯性的访问某个节点而该节点不可用的情况,可以通过LB在NodePort上增加一个负载均衡。该类型主要是云厂商使用。
· ExternalName:让集群内部的Pod能访问到外部的服务,比如数据库服务。它是通过给内部服务生成一个外部主机能解析的Cname实现的。
1、使用命令行创建Services用于暴露服务
kubectl expose deployment nginx-test --port=80 --protocol=TCP --type ClusterIP #将nginx-test这个deployment中的Pod暴露出来,通过80端口访问
2、使用YAML配置清单创建Services用于暴露服务
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
selector:
app: service-demo
ports:
- name: http-80
port: 80
portocol: TCP
sessionAffinity: ClientIP
sessionAffintyConfig:
ClientIP:
timeoutSeconds: 60
3、查看创建的Services,注意观察IP和Type
kubectl get svc
4、修改Service Type。如果要修改Services类型,比如ClusterIP[修改为NodePort,修改后查看信息可以看到多出了一个端口,这个就是所有Pod上暴露出来的可以供外部访问的端口,如果要访问服务的话只需要访问任何一个Node IP:Port就可以了
kubectl edit services nginx-test #会进入编辑界面,修改对应字段为NodePort
kubectl describe svc nginx-test #注意看NodePort
5、K8S滚动更新实现快速迭代
kubectl set image deployment nginx-test nginx=nginx:1.8.1 #将nginx-test这个deployment的nginx镜像进行升级
kubectl rollout status deployment nginx-test #查看迭代状态
kubectl rollout restart deployment nginx-test #有异常的可以先尝试重启
kubectl rollout history deployment nginx-test #查看历史版本
kubectl rollout undo deployment nginx-test --to-revision=1 #退到版本1
五、kubectl与Namaspace管理
Namespace命名空间可以将K8S中不同资源划分到不同的逻辑空间中去,实现环境的隔离,比如生产环境和测试环境各自用自己的Namespace。在查看资源的时候要记得不要忘了使用-n选项指定名称空间,否则默认是default下
1、查看K8S Namespace
kucetl get namespces #default是默认使用的名称空间,kube-system是集群组件专用
2、创建Namespace
kubectl create namespace test --dry-run -o yaml > ns.yaml #导出一份配置清单样例
cat ns.yaml
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: null
name: test
spec: {}
status: {}
kubectl apply -f ns.yaml
3、创建资源时指定Namespace方式
方法1:应用配置清单时单独指定命名空间
kubectl apply -f nginx.yaml --namespace=test
方法2:在配置文件清单中指定
六、kubectl与secrets管理
Secret是K8S中用来保存敏感数据的资源,例如用户token信息。除了系统自身Secret,也可以为用户单独创建Secret。
1、定义一个创建角色的清单文件,以创建admin-user的用户为例,然后将其设置为cluster-admin角色
vi admin-user.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
2、应用清单文件
kubectl apply -f admin-user.yaml
3、查看token信息
kubectl get secrets -n kubernetes-dashboard #可以看到多了admin-user的信息
kubectl get secrets -n kubernetes-dashboard admin-user-token-vw2mc -o yaml #查看该用户的具体信息,里面包含了已经加密过的token
七、K8S Label标签相关命令
标签的存在可以让K8S集群通过标签选择器(selector)对符合条件的资源进行筛选处理,标签可以定义在Node、控制器或者Pod上
1、显示资源的标签
kubectl get pods -n kube-system --show-labels
2、根据标签进行筛选
kubectl get pods -n kube-system -l k8s-app=calico-node #显示k8s-app=calico-node这个标签下的pods,多个标签用逗号分隔
3、定义标签可以通过命令行的方式也可以写在YAML文件中
方法1——命令行方式定义标签
kubectl label pods nginx-test release=beta #给nginx-test这个POD打上标签,名为beta,除了POD也可以给node打标签
kubectl label pods nginx-test release=stable --overwrite #修改beta标签为stable
kubectl label pods -l nginx --show-lables #查看标签包含nginx的容器,可以写多个标签
kubectl label pods -l release=stable --show-lables #查看标签为release且值为stable的容器
方法2——通过YAML定义与使用标签
更多推荐
所有评论(0)