使用 Kubectl 管理 Kubernetes 容器平台
一、Kubectl 概述
二、Kubectl 创建和删除 Pod 相关操作
1.在集群上运行一个镜像
2.Kubectl run 语法
3.Pod 常见的状态
4.使用 Kubectl Delete 删除创建的对象
1)删除 Pod
2)删除 Deployment
三、YAML 语法规则
1.YAML 语法的基本语法规则
2.YAML 支持的三种数据结构
四、Kubectl Create 创建 Deployment
1.生成 Deployment 文件
2.使用 Create 创建 Deployment
3.使用 Get 命令查看 Pod 详细信息
4.使用 Describe 查看 K8s 中的详细信息
五、Kubectl 其他常用命令和参数说明
1.Kubectl Logs
2.Kubectl Exec
3.Kubectl Attach
六、使用 Kubectl 管理集群中 Deployment 资源和 Service 服务
1.生成 Deployment 和 Service 服务的配置文件
2.创建 Deployment 和 Serveice
准备工作:
- 如果未部署 Kubernetes 容器集群管理系统需看:部署 Kubernetes 容器集群管理系统 来进行部署。
- 该实验所需软件包从这个链接下载:https://pan.baidu.com/s/1cNdRaG5bIHr2YNo47-N1Fw
- 提取码:ozfk
一、Kubectl 概述
Kubectl 是一个用于操作 Kubernetes 集群的命令行接口,通过利用 Kubectl 的各种命令可以实现各种功能。
二、Kubectl 创建和删除 Pod 相关操作
1.在集群上运行一个镜像
将 docker.io-nginx.tar 和 pod-infrastructure.tar 上传到 node1 和 node2 上并导入镜像:
[root@node1 ~]# ls anaconda-ks.cfg k8s-package pod-infrastructure.tar docker.io-nginx.tar k8s-package.tar.gz [root@node1 ~]# docker load -i docker.io-nginx.tar [root@node1 ~]# docker load -i pod-infrastructure.tar
2.Kubectl run 语法
Kubectl run 和 Docker run 一样,Kubectl run 能将一个 Pod 运行起来。
- 格式:kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas]
在 master 上启动 Pod:
[root@master ~]# kubectl run nginx-1 --image=docker.io/nginx --replicas=1 --port=9000
查看 Deployment:
[root@master ~]# kubectl get deployment
查看生成的 Pod,Kubernetes 将容器运行在 Pod 中以方便实施卷和网络共享等管理:
[root@master ~]# kubectl get pods
3.Pod 常见的状态
- Running:正常运行的状态。
- ContainerCreating:容器正在创建。
- ImagePullBackOff:镜像拉取失败。
- terminating:终止,删除 Pod 时的状态。
4.使用 Kubectl Delete 删除创建的对象
1)删除 Pod
[root@master ~]# kubectl delete pod nginx-1-2637872784-5kg5l [root@master ~]# kubectl get pod
过 2 分钟左右,再次确认,发现已经运行
2)删除 Deployment
直接删除 Pod 触发了 Replicas 的确保机制,所以需要删除 Deployment
[root@master ~]# kubectl delete deployment nginx-1 [root@master ~]# kubectl get pod
三、YAML 语法规则
YAML 语言的设计目标,就是方便人类读写。它实质上是一种数据串行化格式。
1.YAML 语法的基本语法规则
- 大小写敏感。
- 使用缩进表示层级关系。
- 缩进时不允许使用 Tab 键,只允许使用空格。
- # 表示注释,从这个字符一直到行尾,都会被解析器忽略。
- 在 YAML 里面,连续的项目(如:数组元素、集合元素)通过减号 - 来表示,Map 结构里面的键值对 key/value 用冒号 : 来分割。
2.YAML 支持的三种数据结构
- 对象:键值对的集合,又称为 mapping 映射,hashes 哈希,dictionary 字典。
- 数组:一组按次序排列的值,又称为 sequence 序列,list 列表。
- 纯量(scalars):单个的、不可再分的值。
四、Kubectl Create 创建 Deployment
- 使用 Kubectl run 在配置很复杂的需求时,需要非常长的一条语句,也很容易出错,也没法保存;
- 所以更多场景下会使用 yaml 或者json 文件。
1.生成 Deployment 文件
上传 docker.io-mysql-mysql-server.tar 到 node1 和 node2 上:
[root@node1 ~]# docker load -i docker.io-mysql-mysql-server.tar
编写 Deployment 文件:
[root@master ~]# vim mysql-deployment.yaml kind: Deployment apiVersion: extensions/v1beta1 metadata: name: mysql spec: replicas: 1 template: metadata: labels: name: mysql spec: containers: - name: mysql image: docker.io/mysql/mysql-server imagePullPolicy: IfNotPresent ports: - containerPort: 3306 protocol: TCP env: - name: MYSQL_ROOT_PASSWORD value: "123123"
2.使用 Create 创建 Deployment
[root@master ~]# kubectl create -f mysql-deployment.yaml
- 注意:当一个目录下,有多个 yaml 文件的时候,使用 kubectl create -f 目录 的方式一下全部创建。
3.使用 Get 命令查看 Pod 详细信息
[root@master ~]# kubectl get pod [root@master ~]# kubectl get deployment
加上 -o wide 参数可以查看更详细的信息,如:看 Pod 在哪个 Node 上运行,Pod 的 IP 地址等信息。
[root@master ~]# kubectl get pod -o wide
- 注意:10.255.5.2 这个 IP 地址是 flannel 中定义的网段中的一个 IP 地址(Pod 通过这个 IP 和 Master 进行通信)
在 node2 上查看运行的 Container:
[root@node2 ~]# docker ps
4.使用 Describe 查看 K8s 中的详细信息
五、Kubectl 其他常用命令和参数说明
1.Kubectl Logs
[root@master ~]# kubectl get pod [root@master ~]# kubectl logs mysql-2388517676-588kb
2.Kubectl Exec
exec 命令用于到 pod 中执行一条命令。
[root@master ~]# kubectl get pod [root@master ~]# kubectl exec -it mysql-2388517676-588kb -- /bin/bash bash-4.2# exit
3.Kubectl Attach
attach 用于取得 Pod 中容器的实时信息,可以持续不断实时的取出消息。
[root@master ~]# kubectl attach mysql-2388517676-588kb
- 到现在,所创建 Nginx 和 MySQL 都只是 Deployment,并没有对应 Service 服务;
- 所以现在还不能直接在外网进行访问 Nginx 和 MySQL 服务。
六、使用 Kubectl 管理集群中 Deployment 资源和 Service 服务
1.生成 Deployment 和 Service 服务的配置文件
使用 Deployment 方式启动 Nginx 的 Pod 和 Service:
[root@master ~]# vim nginx-deployment.yaml kind: Deployment apiVersion: extensions/v1beta1 metadata: name: nginx spec: replicas: 1 template: metadata: labels: name: nginx spec: containers: - name: nginx image: docker.io/nginx:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80 protocol: TCP
创建 Service:
[root@master ~]# vim nginx-svc.yaml # 创建 Service kind: Service apiVersion: v1 metadata: name: nginx labels: name: nginx spec: type: NodePort ports: - protocol: TCP nodePort: 31001 targetPort: 80 port: 80 selector: name: nginx
2.创建 Deployment 和 Serveice
[root@master ~]# kubectl create -f nginx-deployment.yaml [root@master ~]# kubectl create -f nginx-svc.yaml
查看:
[root@master ~]# kubectl get service 或者 [root@master ~]# kubectl get svc
查看详细信息:
[root@master ~]# kubectl get pod -o wide
- 现在 Nginx Pod 的 80 端口已经映射到 Node 节点的 31001 端口上。
使用浏览器访问验证:
尽管 Nginx Pod 是在 node1 运行的,但我们去访问任意 node,都可以正常访问 Nginx 的;因为已经做了负载均衡,所以在 node2 上也可以成功访问 Web 服务。
修改一下默认主页:
[root@master ~]# kubectl get pod [root@master ~]# kubectl exec -it nginx-1011335894-shsfx bash root@nginx-1011335894-shsfx:/# echo Nginx > /usr/share/nginx/html/index.html root@nginx-1011335894-shsfx:/# exit
使用浏览器访问测试: