- Kubectl概述
- kubectl是Kubernetes集群的命令行管理工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。
- Kubectl常用示例
可以通过kubectl help命令获取更多的信息。
```bash Basic Commands (Beginner): create Create a resource from a file or from stdin. expose 使用 replication controller, service, deployment 或者 pod 并暴露它作为一个 新的 Kubernetes Service run 在集群中运行一个指定的镜像 set 为 objects 设置一个指定的特征
Basic Commands (Intermediate): explain 查看资源的文档 get 显示一个或更多 resources edit 在服务器上编辑一个资源 delete Delete resources by filenames, stdin, resources and names, or by resources and label selector
Deploy Commands: rollout Manage the rollout of a resource scale 为 Deployment, ReplicaSet, Replication Controller 或者 Job 设置一个新的副本数量 autoscale 自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量
Cluster Management Commands: certificate 修改 certificate 资源. cluster-info 显示集群信息 top Display Resource (CPU/Memory/Storage) usage. cordon 标记 node 为 unschedulable uncordon 标记 node 为 schedulable drain Drain node in preparation for maintenance taint 更新一个或者多个 node 上的 taints
Troubleshooting and Debugging Commands: describe 显示一个指定 resource 或者 group 的 resources 详情 logs 输出容器在 pod 中的日志 attach Attach 到一个运行中的 container exec 在一个 container 中执行一个命令 port-forward Forward one or more local ports to a pod proxy 运行一个 proxy 到 Kubernetes API server cp 复制 files 和 directories 到 containers 和从容器中复制 files 和 directories. auth Inspect authorization
Advanced Commands: apply 通过文件名或标准输入流(stdin)对资源进行配置 patch 使用 strategic merge patch 更新一个资源的 field(s) replace 通过 filename 或者 stdin替换一个资源 wait Experimental: Wait for one condition on one or many resources convert 在不同的 API versions 转换配置文件
Settings Commands: label 更新在这个资源上的 labels annotate 更新一个资源的注解 completion Output shell completion code for the specified shell (bash or zsh)
Other Commands: alpha Commands for features in alpha api-resources Print the supported API resources on the server api-versions Print the supported API versions on the server, in the form of “group/version” config 修改 kubeconfig 文件 plugin Runs a command-line plugin version 输出 client 和 server 的版本信息
- 创建Pod- 此Pod在集群内部可以直接访问。```bash# 创建容器,指定副本数量为1个$ kubectl run nginx-test --image=nginx:1.14.1-alphine --port=80 --replicas=1# 查看pod信息$ [root@master ~]# kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODEnginx-test-8f7b9b965-88t6r 1/1 Running 0 4h13m 10.244.1.2 node1.larryyu.com# 删除pod$ kubectl delete pod nginx-test-8f7b9b965-88t6rpod "nginx-test-8f7b9b965-88t6r" deleted# 删除后k8s会自动创建一个pod来满足用户要求。$ kubectl get podsNAME READY STATUS RESTARTS AGEnginx-test-8f7b9b965-kn6d4 0/1 ContainerCreating 0 7s# k8s在创建pod后,会按照用户要求来保证pod的状态,此时删除了这个pod,k8s会自动重新启动一个容器来满足此pod需要有一个容器的需求。
动态伸缩Pod规模
# 扩展到3个副本 $ kubectl scale --replicas=3 deployment nginx-test deployment.apps/nginx-test scaled $ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-test-8f7b9b965-b8khq 1/1 Running 0 6s nginx-test-8f7b9b965-s88rk 1/1 Running 0 6s nginx-test-8f7b9b965-tncjs 1/1 Running 0 34m灰度升级Pod
# 将deployment的nginx-test中的镜像升级为1.15 $ kubectl set image deployment nginx-test nginx-test=nginx:1.15-alpine deployment.apps/nginx-test image updated # 获取Pod信息,可以看到在升级过程中会出现临时大于3个Pod的情况,多出的就是新升级的Pod。 $ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-test-65bd7df976-kts8q 1/1 Running 0 17s nginx-test-65bd7df976-rtq9n 1/1 Running 0 8s nginx-test-65bd7df976-zrv8n 0/1 ContainerCreating 0 0s nginx-test-8f7b9b965-b8khq 1/1 Terminating 0 5m44s nginx-test-8f7b9b965-tncjs 1/1 Running 0 39m # 升级完成后会变成3个Pod $ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-test-65bd7df976-kts8q 1/1 Running 0 2m37s nginx-test-65bd7df976-rtq9n 1/1 Running 0 2m28s nginx-test-65bd7df976-zrv8n 1/1 Running 0 2m20s # 通过kubectl describe可以查看容器镜像信息 $ kubectl describle pod nginx-test-65bd7df976-kts8q ... Containers: nginx-test: Image: nginx:1.15-alpine # 镜像版本 ... # 回滚操作 $ kubectl rollout undo deployment nginx-test前面我们已经能够通过Deployment调用ReplicaSet来创建一组Pod来提供高可用的服务,会为每个Pod分配一个单独的Pod IP,但却存在以下问题
- Pod IP仅仅是集群内可见的虚拟IP,外部无法访问
- Pod IP会随着Pod的销毁而消失,当ReplicaSet对Pod进行动态伸缩调整时,可能无法访问这个Pod服务
此时,可以通过K8S提供的Service来解决
Service介绍
- service可以看做是一组日工相同服务的Pod对外的访问接口,借助Service,应用可以方便的实现服务发现和负载均衡
创建service
$ kubectl expose deployment nginx-test --name=nginx --port=80 --target-port=80 --protocol=TCP # 查看service ip $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d17h nginx ClusterIP 10.97.193.24 <none> 80/TCP 39s此时无论Pod如何动态伸缩,均可通过service Ip访问,原理就是service通过绑定deployment中的Labels标签来识别Pod,无论Pod地址如何变化,均可通过Labels来绑定到Pod
# 查看service详细信息 $ kubectl describe service nginx Name: nginx Namespace: default Labels: run=nginx-test # 绑定的deployment标签 Annotations: <none> Selector: run=nginx-test Type: ClusterIP IP: 10.97.193.24 Port: <unset> 80/TCP TargetPort: 80/TCP Endpoints: 10.244.2.5:80 Session Affinity: None Events: <none> # 查看deployment标签信息,通过这个标签绑定即可 [root@master ~]# kubectl get deployment -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR nginx-test 1/1 1 1 2d2h nginx-test nginx:1.14-alpine run=nginx-test上面创建的Service类型为ClusterIP,Service还支持以下几种类型
- Service类型
- ClusterIP:默认值,给这个Service分配一个ClusterIP,是K8s自动分配的虚拟IP,只能在集群内部访问
- NodePort:将Service通过指定的Node上的端口暴露给外部,通过此方法,访问任意一个NodeIP:nodePort都将路由到ClusterIP,从而到该Pod服务
- LoadBalancer:在NodePort的基础上,借助cloud provider创建一个负载均衡器,并将请求转发到:NodePort,此模式只能在云服务器上使用
- ExternalName:将服务通过DNS CNAME记录方式转发到指定域名,通过spec.externlName设定
创建可以在集群外部访问Service
$ kubectl edit svc nginx ... spec: clusterIP: 10.97.193.24 ... type: NodePort # NodePort既表示可在集群外部访问 ... $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d18h nginx NodePort 10.97.193.24 <none> 80:32708/TCP 67m # 可以看到会映射到外部32708端口创建Pod流程

1、kubectl提交创建Pod,API相应请求,通过一系列的认证授权,把Pod数据存储到etcd,创建Deployment资源并初始化
2、Controller通过list-watch机制,检测发现新的deployment,发现该资源没有关联Pod和ReplicaSet,启动Deploument Controller创建ReplicaSet资源,在启用ReplicaSet Controller创建Pod
3、所有COntroller正常后,将Deployment,replicaSet,pod资源信息更新到etcd
4、Scheduler通过list-watch机制,检测发现新的Pod,进过打分选择规则,将Pod绑定到合适的主机
5、将绑定结果更新的etcd
6、kubectl每个20s向kube-apiserver通过NodeName获取自身Node上所要运行的Pod清单,通过与自己的内存缓存进行比较,新增Pod
7、启动Pod启动容器
8、将容器信息Pod信息同步到etcd。
