kubectl 是 apiserver 的客户端程序,这个客户端程序是通过连接 master 节点上的 apiserver ,实现各种 k8s 对象的增删改查等基本操作,在 k8s 可被管理的对象有很多个
基本命令 (初级):
create 从文件或标准输入创建资源
expose 获取一个复制控制器, 服务, 部署或者暴露一个 POD 将其作为新的 Kubernetes 服务公开
run 创建并运行特定的镜像, 创建使用 deployment 或 job 管理的容器
set 设置对象的特定功能, 例如发布, 每次去set 不用的image tag
基本命令 (中级):
explain 文档或者资源, 可以用来查看资源清单写法
get 显示一个或多个资源
edit 编辑服务器上的资源
delete 按文件名, 标准输入, 资源和名称或资源和标签选择器删除资源
了解pods和nodes
# kubectl get 资源类型
#获取类型为Deployment的资源列表
kubectl get deployments
#获取类型为Pod的资源列表
kubectl get pods
#获取类型为Node的资源列表
kubectl get nodes
# kubectl describe 资源类型 资源名称
#查看名称为nginx-XXXXXX的Pod的信息
kubectl describe pod nginx-XXXXXX
#查看名称为nginx的Deployment的信息
kubectl describe deployment nginx
# kubectl logs Pod名称
#查看名称为nginx-pod-XXXXXXX的Pod内的容器打印的日志
#本案例中的 nginx-pod 没有输出日志,所以您看到的结果是空的
kubectl logs -f nginx-pod-XXXXXXX
# kubectl exec Pod名称 操作命令
# 在名称为nginx-pod-xxxxxx的Pod中运行bash
kubectl exec -it nginx-pod-xxxxxx /bin/bash
kubectl run nginx --image=nginx:latest
名为nginx-v2,--image=镜像名,--replicas=副本数
kubectl run nginx-v2 --image=nginx:latest --replicas=3 #启动3个pod
kubectl get namespaces
kubectl get pods,services -o wide
Deployment 译名为 部署。在k8s中,通过发布 Deployment,可以创建应用程序 (docker image) 的实例 (docker container),这个实例会被包含在称为 Pod 的概念中,Pod 是 k8s 中最小可管理单元
创建文件 nginx-deployment.yaml
apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment #该配置的类型,我们使用的是 Deployment
metadata: #译名为元数据,即 Deployment 的一些基本属性和信息
name: nginx-deployment #Deployment 的名称
labels: #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
app: nginx #为该Deployment设置key为app,value为nginx的标签
spec: #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
replicas: 1 #使用该Deployment创建一个应用程序实例
selector: #标签选择器,与上面的标签共同作用,目前不需要理解
matchLabels: #选择包含标签app:nginx的资源
app: nginx
template: #这是选择或创建的Pod的模板
metadata: #Pod的元数据
labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
app: nginx
spec: #期望Pod实现的功能(即在pod中部署)
containers: #生成container,与docker中的container是同一种
- name: nginx #container的名称
image: nginx:1.18.0 #使用镜像nginx:1.18.0创建container,该container默认80端口可访问
参考
kubectl apply -f nginx-deployment.yaml
# 查看 Deployment
kubectl get deployments
# 查看 Pod
kubectl get pods
Pod(容器组)有自己的 生命周期。当 worker node(节点)故障时,节点上运行的 Pod(容器组)也会消失。然后,Deployment 可以通过创建新的 Pod(容器组)来动态地将群集调整回原来的状态,以使应用程序保持运行
Kubernetes 中的 Service(服务) 提供了这样的一个抽象层,它选择具备某些特征的 Pod(容器组)并为它们定义一个访问方式。Service(服务)使 Pod(容器组)之间的相互依赖解耦(原本从一个 Pod 中访问另外一个 Pod,需要知道对方的 IP 地址)。一个 Service(服务)选定哪些 Pod(容器组) 通常由 LabelSelector(标签选择器) 来决定
在创建Service的时候,通过设置配置文件中的 spec.type 字段的值,可以以不同方式向外部暴露应用程序:
ClusterIP(默认)
在群集中的内部IP上公布服务,这种方式的 Service(服务)只在集群内部可以访问到
NodePort
使用 NAT 在集群中每个的同一端口上公布服务。这种方式下,可以通过访问集群中任意节点+端口号的方式访问服务 :
。此时 ClusterIP 的访问方式仍然可用。
LoadBalancer
在云环境中(需要云供应商可以支持)创建一个集群外部的负载均衡器,并为使用该负载均衡器的 IP 地址作为服务的访问地址。此时 ClusterIP 和 NodePort 的访问方式仍然可用
vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service #Service 的名称
labels: #Service 自己的标签
app: nginx #为该 Service 设置 key 为 app,value 为 nginx 的标签
spec: #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问
selector: #标签选择器
app: nginx #选择包含标签 app:nginx 的 Pod
ports:
- name: nginx-port #端口的名字
protocol: TCP #协议类型 TCP/UDP
port: 80 #集群内的其他容器组可通过 80 端口访问 Service
nodePort: 32600 #通过任意节点的 32600 端口访问 Service
targetPort: 80 #将请求转发到匹配 Pod 的 80 端口
type: NodePort #Serive的类型,ClusterIP/NodePort/LoaderBalancer
kubectl apply -f nginx-service.yaml
kubectl get services -o wide
浏览器:<任意节点的 IP>:32600
curl <任意节点的 IP>:32600
部署一个 Deployment,然后通过 服务 提供访问 Pod 的方式。我们发布的 Deployment 只创建了一个 Pod 来运行我们的应用程序。当流量增加时,我们需要对应用程序进行伸缩操作以满足系统性能需求。
伸缩 的实现可以通过更改 nginx-deployment.yaml 文件中部署的 replicas(副本数)来完成
spec:
replicas: 2 #使用该Deployment创建两个应用程序实例
修改 nginx-deployment.yaml 文件,将 replicas 修改为 4
vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1 #修改成4
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
执行命令
kubectl apply -f nginx-deployment.yaml
查看结果
watch kubectl get pods -o wide
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 4
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19.0 #使用镜像nginx:1.18.0替换原来的nginx:1.18.0
ports:
- containerPort: 80
kubectl apply -f nginx-deployment.yaml
执行命令,可观察到 pod 逐个被替换的过程。
atch kubectl get pods -l app=nginx
参考:
原文:https://www.cnblogs.com/pansn/p/13267990.html