使用 Kubectl 管理 Kubernetes 容器平台
- 一、Kubectl 概述
- 二、Kubectl 创建和删除 Pod 相关操作
- 1.在集群上运行一个镜像
- 2.Kubectl run 语法
- 3.Pod 常见的状态
- 3.使用 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 时的状态。
3.使用 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 中的详细信息
命令 | 作用 |
| 查看 Pod 的详细描述信息 |
| 查看 Node 的详细描述信息 |
| 查看 Deployment 的详细描述信息 |
五、Kubectl 其他常用命令和参数说明
命令 | 说明 |
| 查看 Pod 的日志信息 |
| 在 Pod 中执行一条命令 |
| 从容器拷出或向容器拷入文件 |
| 到一个运行中的容器上,实时查看容器消息 |
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
使用浏览器访问测试: