本文收录在容器技术学习系列文章总目录
1、使用kubectl
1.1 介绍
kubectl用于运行Kubernetes集群命令的管理工具。
1.2 语法
kubectl [command] [TYPE] [NAME] [flags]
- command:指定要在一个或多个资源执行的操作,例如操作create,get,describe,delete。TYPE:指定资源类型Resource types。
- Name区分大小写,如果省略Name,则显示所有资源的详细信息,例如:$ kubectl get pods。
1.3 选项
1.4 示例演示
(1)简单的查询操作
查询节点详细信息
[root@master ~]# kubectl describe node node1 Name: node1 Roles: <none> Labels: beta.kubernetes.io/arch=amd64 ... ...
查看版本
[root@master ~]# kubectl version Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.1", GitCommit:"bb9ffb1654d4a729bb4cec18ff088eacc153c239", GitTreeState:"clean", BuildDate:"2018-08-07T23:17:28Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.1", GitCommit:"b1b29978270dc22fecc592ac55d903350454310a", GitTreeState:"clean", BuildDate:"2018-07-17T18:43:26Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
查看集群信息
[root@master ~]# kubectl cluster-info Kubernetes master is running at https://192.168.10.103:6443 KubeDNS is running at https://192.168.10.103:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
2、run运行
2.1 介绍
创建并运行一个或多个容器镜像。
2.2 命令
$ kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [--command] -- [COMMAND] [args...] [options]
2.3 常用选项
- --port:要暴露的端口
- --replicas:期望创建几个Pod,默认1个
- --dry-run:true为干跑
2.4 演示
(1)运行一个nginx的pod
[root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 deployment.apps/nginx-deploy created
(2)在master上查询验证
[root@master ~]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deploy 1 1 1 1 44s [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deploy-5b595999-6kw54 1/1 Running 0 51s [root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-deploy-5b595999-6kw54 1/1 Running 0 1m 10.244.2.2 node2
(3)在部署的node节点上查询
[root@node2 ~]# ifconfig |head -2 cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450 inet 10.244.2.1 netmask 255.255.255.0 broadcast 0.0.0.0
(4)访问pod内的nginx服务
[root@node1 ~]# curl 10.244.2.2 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title>
3、delete删除
3.1 介绍
- 通过配置文件名、stdin、资源名称或label选择器来删除资源。
- 支持JSON和YAML格式文件。可以只指定一种类型的参数:文件名、资源名称或label选择器。
3.2 语法
$ kubectl delete ([-f FILENAME] | TYPE [(NAME | -l label | --all)])
3.3 演示
删除刚才的pod,立刻会生成一个新的pod,因为此pod是控制器管理的
[root@master ~]# kubectl delete pods nginx-deploy-5b595999-6kw54 pod "nginx-deploy-5b595999-6kw54" deleted [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deploy-5b595999-jf5gm 0/1 ContainerCreating 0 16s [root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-deploy-5b595999-jf5gm 1/1 Running 0 47s 10.244.1.2 node1
4、expose暴露
4.1 介绍
- 将资源暴露为新的Kubernetes Service。
- 指定deployment、service、replica set、replication controller或pod ,并使用该资源的选择器作为指定端口上新服务的选择器。deployment 或 replica set只有当其选择器可转换为service支持的选择器时,即当选择器仅包含matchLabels组件时才会作为暴露新的Service。
- 资源包括(不区分大小写):pod(po),service(svc),replication controller(rc),deployment(deploy),replica set(rs)
4.2 语法
$ kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type]
4.3 常用选项
- --port:暴露在service上的端口
- --target-port:容器中的端口
4.4 演示
(1)将nginx-deploy控制器中相关的Pod资源创建一个名为nginx的服务
[root@master ~]# kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP service/nginx exposed [root@master ~]# kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16h nginx ClusterIP 10.96.212.79 <none> 80/TCP 9s [root@master ~]# kubectl get svc #简写 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16h nginx ClusterIP 10.96.212.79 <none> 80/TCP 13s
(2)验证,在集群内部节点访问服务
[root@master ~]# curl 10.96.212.79 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title>
(3)删除pod,立即生产新的pod,但是service还是不变,继续提供服务,只是指定到新的pod
---删除pod [root@master ~]# kubectl delete pods nginx-deploy-5b595999-jf5gm ---立即生产新的pod,service继续提供服务 [root@master ~]# curl 10.96.212.79 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ---指定到新的pod [root@master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-deploy-5b595999-2z769 1/1 Running 0 29m 10.244.1.2 node2 [root@master ~]# kubectl describe svc nginx Name: nginx Namespace: default Labels: run=nginx-deploy Annotations: <none> Selector: run=nginx-deploy Type: ClusterIP IP: 10.96.212.79 Port: <unset> 80/TCP TargetPort: 80/TCP Endpoints: 10.244.1.2:80 Session Affinity: None Events: <none>
5、scale动态扩容/缩容
5.1 介绍
- 扩容或缩容 Deployment、ReplicaSet、Replication Controller或 Job 中Pod数量。
- scale也可以指定多个前提条件,如:当前副本数量或 --resource-version ,进行伸缩比例设置前,系统会先验证前提条件是否成立。
5.2 语法
$ kubectl scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME)
5.3 演示
(1)先运行名为myapp标签选择器的2个pod,镜像是我用于测试演示自己构建的
[root@master ~]# kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2 deployment.apps/myapp created [root@master ~]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE myapp 2 2 2 2 6s [root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE myapp-848b5b879b-58jcr 1/1 Running 0 11s 10.244.2.53 node2 myapp-848b5b879b-wpx9v 1/1 Running 0 11s 10.244.1.56 node1
(2)创建service,并验证
[root@master ~]# kubectl expose deployment myapp --name=myapp --port=80 service/myapp exposed [root@master ~]# kubectl get svc myapp NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE myapp ClusterIP 10.104.205.158 <none> 80/TCP 8s [root@master ~]# curl 10.104.205.158 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> ---因为有2个pod,所以是随机调度 [root@master ~]# curl 10.104.205.158/hostname.html myapp-848b5b879b-58jcr [root@master ~]# curl 10.104.205.158/hostname.html myapp-848b5b879b-wpx9v
(3)使用scale,将pod扩容到5个
[root@master ~]# kubectl scale --replicas=5 deployment myapp deployment.extensions/myapp scaled [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE myapp-848b5b879b-2sj8n 1/1 Running 0 8s myapp-848b5b879b-58jcr 1/1 Running 0 4m myapp-848b5b879b-hp7zs 1/1 Running 0 8s myapp-848b5b879b-sfq8r 1/1 Running 0 8s myapp-848b5b879b-wpx9v 1/1 Running 0 4m
(4)使用scale,将pod缩容到3个
[root@master ~]# kubectl scale --replicas=3 deployment myapp [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE myapp-848b5b879b-2sj8n 1/1 Running 0 1m myapp-848b5b879b-58jcr 1/1 Running 0 6m myapp-848b5b879b-wpx9v 1/1 Running 0 6m
6、set动态升级版本
6.1 介绍
(1)set
- 配置应用资源。
- 使用这些命令能帮你更改现有应用资源一些信息。
- 子命令:image、resources、selector、subject
(2)set image
- 更新现有的资源对象的容器镜像。
- 可使用资源对象包括(不区分大小写):pod (po)、replicationcontroller (rc)、deployment (deploy)、daemonset (ds)、job、replicaset (rs)
6.2 语法
$ kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N
6.3 演示
将镜像版本从v1升级到v2版
[root@master ~]# kubectl set image deployment myapp myapp=ikubernetes/myapp:v2 deployment.extensions/myapp image updated [root@master ~]# kubectl rollout status deployment myapp #动态显示版本升级过程 ---因为版本升级,所以pod都是新建的,名字都改变了 [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE client 1/1 Running 0 3h myapp-74c94dcb8c-d5fgk 1/1 Running 0 55s myapp-74c94dcb8c-f2ntn 1/1 Running 0 21s myapp-74c94dcb8c-ht9v7 1/1 Running 0 38s ---验证,版本升级成功 [root@master ~]# curl 10.104.205.158 Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
7、rollout undo回滚版本
7.1 介绍
(1)rollout
- 对资源进行管理
- 可用资源包括:deployments、daemonsets
- 子命令:history(查看历史版本)、pause(暂停资源)、resume(恢复暂停资源)、status(查看资源状态)、undo(回滚版本)
(2)rollout undo
回滚pod到之前的版本。
7.2 语法
$ kubectl rollout undo (TYPE NAME | TYPE/NAME) [flags]
7.3 演示
[root@master ~]# kubectl rollout undo deployment myapp deployment.extensions/myapp [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE myapp-848b5b879b-gg9lr 1/1 Running 0 15s myapp-848b5b879b-km4t6 1/1 Running 0 16s myapp-848b5b879b-nq98c 1/1 Running 0 17s ---验证,回滚成功 [root@master ~]# curl 10.104.205.158 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
8、edit编辑修改
8.1 介绍
- 使用默认编辑器,编辑服务器上定义的资源。
- 使用命令行工具获取的任何资源都可以使用edit命令编辑。edit命令会打开使用KUBE_EDITOR,GIT_EDITOR 或者EDITOR环境变量定义的编辑器,可以同时编辑多个资源,但所编辑过的资源只会一次性提交。edit除命令参数外还接受文件名形式。
- 文件默认输出格式为YAML。要以JSON格式编辑,请指定“-o json”选项。
- 如果在更新资源时报错,将会在磁盘上创建一个临时文件来记录。在更新资源时最常见的错误是几个用户同时使用编辑器更改服务器上资源,发生这种情况,你需要将你的更改应用到最新版本的资源上,或者更新保存的临时副本。
8.2 语法
$ kubectl edit (RESOURCE/NAME | -f FILENAME)
8.3 演示
(1)修改service,将类型type: ClusterIP,修改为type: NodePort;修改后,可以在集群外访问到pod中的服务
[root@master ~]# kubectl edit svc myapp ... ... spec: ... ... type: NodePort ... ... service/myapp edited [root@master ~]# kubectl get svc myapp NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE myapp NodePort 10.104.205.158 <none> 80:31599/TCP 23m
(2)在集群外的主机上访问了