一、了解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定义与使用标签 

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐