使用 Kubectl 管理 Kubernetes 容器平台
准备工作:
- 如果未部署 Kubernetes 容器集群管理系统需看:部署 Kubernetes 容器集群管理系统 来进行部署。
- 该实验所需软件包从这个链接下载:https://pan.baidu.com/s/1cNdRaG5bIHr2YNo47-N1Fw
- 提取码:ozfk
一、Kubectl 概述
Kubectl 是一个用于操作 kubernetes 集群的命令行接口,通过利用 Kubectl 的各种命令可以实现各种功能。
二、Kubectl 创建和删除一个 pod 相关操作
命令 | 说明 |
---|---|
run | 在集群上运行一个 pod |
create | 使用文件或标准输入的方式创建一个 pod |
delete | 使用文件或者标准输入以及资源名称或者标签选择器来删除某个 pod |
1.在集群上运行一个镜像
将 docker.io-nginx.tar 和 pod-infrastructure.tar 上传到 node1 和 node2 上并导入镜像
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.pods 常见的状态
- ContainerCreating:容器正在创建。
- ImagePullBackOff:从后端把镜像拉取到本地时中断。
- terminating:终止;当删除 pod 时的状态。
- Running:正常运行的状态。
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 加载 yaml 文件生成 deployment
使用 Kubectl run 在设置很复杂的需求时,需要非常长的一条语句,也很容易出错,也没法保存,所以更多场景下会使用 yaml 或者 json 文件。
1.生成 mysql-deployment.yaml 文件
上传 docker.io-mysql-mysql-server.tar 到 node1 和 node2 上
node1,node2操作一致
[root@node1 ~]# docker load -i docker.io-mysql-mysql-server.tar
[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.使用 mysql-deployment.yaml 创建和删除 mysql 资源
[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 上查看运行 mysql docker 实例:
[root@node2 ~]# docker ps
4.使用 describe 查看 k8s 中详细信息
- 查看 pod 的详细描述信息:kubectl describe pod pod名字
- 查看 node 的详细描述信息:kubectl describe node node名字
- 查看 deployment 的详细描述信息:kubectl describe deployment deployment名字
五、Kubectl 其他常用命令和参数说明
命令 | 说明 |
---|---|
logs | 取得 pod 中容器的 log 信息 |
exec | 在 pod 中执行一条命令 |
cp | 从容器拷出或向容器拷入文件 |
attach | attach 到一个运行中的容器上,实时查看容器消息 |
1.Kubectl logs
类似于 Docker logs,使用 Kubectl logs 能够取出 pod 中镜像的 log,也是故障排除时候的重要信息。
[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 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.生成 nginx-deployment.yaml 资源和 nginx-svc.yaml 服务的配置文件
使用 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
[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 容器中的 80 端口已经映射到 node(Minion 物理机)节点的 31001 端口上了。可以查看到 nginx 服务已经运行在 node1 上。
使用浏览器访问测试:
尽管 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
使用浏览器访问测试: