kubectl 命令使用

kubectl run 的使用

1
kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [--command] -- [COMMAND] [args...] [options]

部署 redis:

1
kubectl run redis --image='redis:alpine'

输出:

1
2
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use 
kubectl run --generator=run-pod/v1 or kubectl create instead.

kubectl get 的使用

1
2
3
4
kubectl get deployment.apps/redis -o wide
kubectl get rs -o wide // ReplicaSet 可简写为 rs. pod-template 标签是由 Deployment controller 自动添加的,hash 用作唯一性标识, 目的是防止出现重复
kubectl get service -o wide
kubectl get deploy -l run=redis -o wide // Label 可作为选择条件进行使用, 金丝雀发布(Canary deployments), 主要依赖 Label 和 Selector

ReplicaSet 是一种较低级别的结构,允许进行扩容。
Deployment 主要是声明一种预期的状态,并且会将 Pod 托管给 ReplicaSet,而 ReplicaSet 则会去检查当前的 Pod 数量及状态是否符合预期,并尽量满足这一预期。

service 外部访问

Service 目前有 4 种类型:

1
2
3
4
ClusterIP: 是 K8S 当前默认的 Service 类型。将 service 暴露于一个仅集群内可访问的虚拟 IP 上。
NodePort: 是通过在集群内所有 Node 上都绑定固定端口的方式将服务暴露出来,这样便可以通过 <NodeIP>:<NodePort> 访问服务了。
LoadBalancer: 是通过 Cloud Provider 创建一个外部的负载均衡器,将服务暴露出来,并且会自动创建外部负载均衡器路由请求所需的 Nodeport 或 ClusterIP 。
ExternalName: 是通过将服务由 DNS CNAME 的方式转发到指定的域名上将服务暴露出来,这需要 kube-dns 1.7 或更高版本支持。

将 redis 服务暴露出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
kubectl expose deploy/redis --port=6379 --protocol=TCP --target-port=6379 --name=redis-server
kubectl get svc -o wide
kubectl get no -o wide

port:
是 Service 暴露出来的端口,可通过此端口访问 Service。
protocol:
是所用协议。当前 K8S 支持 TCP/UDP 协议,在 1.12 版本中实验性的加入了对 SCTP 协议的支持。默认是 TCP 协议。
target-port:
是实际服务所在的目标端口,请求由 port 进入通过上述指定 protocol 最终流向这里配置的端口。
name:
Service 的名字,它的用处主要在 dns 方面。
type:
如果没指定默认是 ClusterIP。

ClusterIP 并不能直接通过外部进行访问,我们使用 port-forward 的方式让它可在集群外部访问:

1
kubectl port-forward svc/redis-server 6379:6379

NodePort 的方式对外暴露服务:

1
2
kubectl expose deploy/redis --port=6379 --protocol=TCP --target-port=6379 --name=redis-server-nodeport --type=NodePort
kubectl get service/redis-server-nodeport -o wide

这里需要注意的是这个端口范围其实是可以通过 kube-apiserver 的 service-node-port-range 进行配置的,默认是 30000-32767(通过kube-apiserver 的 service-node-port-range 进行配置)
如果使用的是 kind 安装 需要在 docker 内部访问(访问命令 docker exec -it ${containerId} /bin/bash)

Pod 扩容

1
2
kubectl scale deploy/redis --replicas=2
kubectl get pods

参考资料:

SCTP