使用Minikube创建集群
Minikube是一个轻量级的Kubernets实现,会在本机创建一台虚拟机,并部署一个只包含一个节点的简单集群。Minikube CLI提供了集群的基本引导操作,包括启动、停止、状态和删除。
查看minikube版本:
minikube version
启动集群:
minikube start
查看客户端和服务器版本:
kubectl version
客户端版本是kubectl版本,服务器版本是Kubernetes版本。
查看集群详细信息:
kubectl cluster-info
查看node节点:
kubectl get nodes
使用kubectl创建部署
使用--help查看命令说明:
kubectl get nodes --help
部署应用:
kubectl run kubernetes-bootcamp --image=grc.io/google-samples/kubernetes-bootcamp:v1 --port=8000
执行上面的命令会自动找一个合适的节点部署应用。
获取所有的应用:
kubectl get deployments
Pods是运行在一个独立的网络中,默认是对kubenetes内部的其它pods和服务可见,对外部不可见。
使用proxy可以将集群和主机建立连接:
kubectl proxy
这样就可以通过代理终端访问所有的API:
curl http://localhost:8001/version
API服务器会自动为每个pod创建一个终端,可以通过代理访问:
export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME
curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/
查看Pods和节点
查看日志:
kubectl logs $POD_NAME
查看环境变量:
kubectl exec $POD_NAME env
开启bash:
kubectl exec -ti $POD_NAME bash
查看引用的源码:
cat server.js
检查应用是否启动:
curl localhost:8080
使用服务发布应用程序
创建新的服务
确保应用正在运行,列出当前存在的pod:
kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5c69669756-fbbl8 0/1 Pending 0 3s
列出集群当前的服务:
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 36s
创建一个新的服务,并将它暴露在集群之外:
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
重新查询服务,会发现刚才暴露的服务在列表中:
kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1m
kubernetes-bootcamp NodePort 10.110.72.205 <none> 8080:31979/TCP 5s
查看什么端口暴露在外部:
kubectl describe services/kubernetes-bootcamp
Name: kubernetes-bootcamp
Namespace: default
Labels: run=kubernetes-bootcamp
Annotations: <none>
Selector: run=kubernetes-bootcamp
Type: NodePort
IP: 10.110.72.205
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 31979/TCP
Endpoints: 172.18.0.4:8080
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
创建NODE_PORT的环境变量,并且指定为Node端口值:
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
echo NODE_PORT=$NODE_PORT
NODE_PORT=31979
现在通过curl测试应用是否暴露在外部:
curl $(minikube ip):$NODE_PORT
使用标签
pods会被自动创建一个标签,可以使用describe查看:
kubectl describe deployment
使用-l参数指定标签查询pod:
kubectl get pods -l run=kubernetes-bootcamp
同样,可以使用-l参数查询服务:
kubectl get services -l run=kubernetes-bootcamp
获取pod的名字,并将它放在POD_NAME环境变量中:
export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME
给pod指定新的标签:
kubectl label pod $POD_NAME app=v1
查看pod是否被指定新的标签:
kubectl describe pods $POD_NAME
使用新的标签获取pod:
kubectl get pods -l app=v1
删除服务
删除服务:
kubectl delete service -l run=kubernetes-bootcamp
确认服务是否被删除:
kubectl get services
确认路由不再暴露在外部:
curl $(minikube ip):$NODE_PORT
curl: (7) Failed to connect to 172.17.0.142 port 31979: Connection refused
这个结果说明应用不再能被外部访问,确认服务依然可以被pod内部访问:
kubectl exec -ti $POD_NAME curl localhost:8080
扩展应用
扩展deployment
列出deployments:
kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1 1 1 1 2m
- DESIRED: 配置的复制品数量
- CURRENT: 当前运行的复制品数量
- UP-TO-DATE: 更新到期望状态的复制品数量
- AVAILABLE: 可以使用的复制品数量
将deployment扩展到四个复制品:
kubectl scale deployments/kubernetes-bootcamp --replicas=4
再次列出deployments:
kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 4 4 4 4 15m
检查pod数量是否改变:
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
kubernetes-bootcamp-5c69669756-k5dzj 1/1 Running 0 2m 172.18.0.5 minikube
kubernetes-bootcamp-5c69669756-pds6q 1/1 Running 0 2m 172.18.0.7 minikube
kubernetes-bootcamp-5c69669756-qxght 1/1 Running 0 2m 172.18.0.6 minikube
kubernetes-bootcamp-5c69669756-xfjd2 1/1 Running 0 17m 172.18.0.2 minikube
可以看到现在有4个Pod了,并且有不同的IP地址。使用describe进行检查:
kubectl describe deployments/kubernetes-bootcamp
负载均衡
查看暴露的IP和端口:
kubectl describe services/kubernetes-bootcamp
获取node端口:
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
echo NODE_PORT=$NODE_PORT
访问服务:
curl $(minikube ip):$NODE_PORT
多次使用curl命令可以看到,到达的是不同的pod,说明实现了负载均衡。
收缩deployment
命令和扩展基本相同:
kubectl scale deployments/kubernets-bootcamp --replicas=2
kubectl get deployments
kubectl get pods -o wide
应用更新
更新应用的版本
首先,查看当前的版本情况:
kubectl get deployments
kubectl get pods
kubectl describe pods
更新应用的镜像到版本2,使用set image:
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
这个命令会为应用使用一个新的镜像,重新查看pod:
kubectl get pods
确认更新
确认应用在运行,查看IP和端口:
kubectl describe services/kubernetes-bootcamp
获取和查看node端口:
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
echo NODE_PORT=$NODE_PORT
访问服务:
curl $(minikube ip):$NODE_PORT
可以看到多次请求会到达不同的pod,并且可以看到所有的pod都是在运行版本2
还可以使用rollout来确认更新:
kubectl rollout status deployments/kubernetes-bootcamp
查看当前镜像的版本:
kubectl describe pods
回滚更新
首先更新应用:
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10
然后查看当前情况:
kubectl get deployments
kubectl get pods
kubectl describe pods
接着进行回滚:
kubectl rollout undo deployments/kubernetes-bootcamp
最后查看回滚情况:
kubectl get pods
kubectl describe pods