https://kubernetes.io/zh/docs/tutorials/kubernetes-basics/
https://www.kubernetes.org.cn/k8s
啟動minikube(https://github.com/AliyunContainerService/minikube)
https://developer.aliyun.com/article/221687
```
minikube version
minikube start
minikube status
minikube dashboard
kubectl version
kubectl cluster-info
kubectl get nodes
```
Deployment為Pod和ReplicaSet提供了一個聲明式定義(declarative)方法
* 定義Deployment來創(chuàng)建Pod和ReplicaSet
* 滾動升級和回滾應用
* 擴容和縮容
* 暫停和繼續(xù)Deployment
```
kubectl create deployment hello-node --image=k8s.gcr.io/echoserver:1.4
kubectl get deployments
kubectl expose deployment hello-node --type=NodePort --port=8080
minikube service hello-node --url
kubectl delete services hello-node
kubectl delete deployment hello-node
kubectl get pods
kubectl get events
kubectl config view
```
Service服務總體上抽象了對Pod的訪問
默認情況下,Pod 只能通過 Kubernetes 集群中的內部 IP 地址訪問宾巍。 要使得?hello-node?容器可以從 Kubernetes 虛擬網絡的外部訪問咕幻,你必須將 Pod 暴露為 Kubernetes?Service。
```
kubectl expose deployment hello-node --type=LoadBalancer --port=8080
kubectl get services
minikube service hello-node
```
Minikube 有一組內置的?插件顶霞, 可以在本地 Kubernetes 環(huán)境中啟用肄程、禁用和打開。
```
minikube addons list
minikube addons enable metrics-server
kubectl get pod,svc -n kube-system
minikube addons disable metrics-server
```
清理
```
kubectl delete service hello-node
kubectl delete deployment hello-node
minikube stop
minikube delete
```
創(chuàng)建 Deployment 時, Kubernetes 添加了一個?Pod?來托管你的應用實例选浑。Pod 是 Kubernetes 抽象出來的蓝厌,表示一組一個或多個應用程序容器(如 Docker),以及這些容器的一些共享資源鲜侥。這些資源包括:
共享存儲褂始,當作卷
網絡,作為唯一的集群 IP 地址
有關每個容器如何運行的信息描函,例如容器映像版本或要使用的特定端口崎苗。
故障排查
kubectl get?- 列出資源
kubectl describe?- 顯示有關資源的詳細信息
kubectl logs?- 打印 pod 和其中容器的日志
kubectl exec?- 在 pod 中的容器上執(zhí)行命令
```
kubectl exec POD_NAME env
kubectl exec -it POD_NAME bash
```
Kubernetes 中的服務(Service)是一種抽象概念,它定義了 Pod 的邏輯集和訪問 Pod 的協(xié)議舀寓。Service 使從屬 Pod 之間的松耦合成為可能胆数。
盡管每個 Pod 都有一個唯一的 IP 地址,但是如果沒有 Service 互墓,這些 IP 不會暴露在群集外部必尼。Service 允許您的應用程序接收流量。Service 也可以用在 ServiceSpec 標記type的方式暴露
ClusterIP?(默認) - 在集群的內部 IP 上公開 Service 篡撵。這種類型使得 Service 只能從集群內訪問判莉。
NodePort?- 使用 NAT 在集群中每個選定 Node 的相同端口上公開 Service 。使用<NodeIP>:<NodePort>?從集群外部訪問 Service育谬。是 ClusterIP 的超集券盅。
LoadBalancer?- 在當前云中創(chuàng)建一個外部負載均衡器(如果支持的話),并為 Service 分配一個固定的外部IP膛檀。是 NodePort 的超集锰镀。
ExternalName?- 通過返回帶有該名稱的 CNAME 記錄,使用任意名稱(由 spec 中的externalName指定)公開 Service咖刃。不使用代理泳炉。這種類型需要kube-dns的v1.7或更高版本。
Service 通過一組 Pod 路由通信嚎杨。Service 是一種抽象花鹅,它允許 Pod 死亡并在 Kubernetes 中復制,而不會影響應用程序枫浙。在依賴的 Pod (如應用程序中的前端和后端組件)之間進行發(fā)現(xiàn)和路由是由Kubernetes Service 處理的翠胰。|
Service 匹配一組 Pod 是使用?標簽(Label)和選擇器(Selector), 它們是允許對 Kubernetes 中的對象進行邏輯操作的一種分組原語。標簽(Label)是附加在對象上的鍵/值對自脯,可以以多種方式使用:
指定用于開發(fā)之景,測試和生產的對象
嵌入版本標簽
使用 Label 將對象進行分類
```
kubectl get pods
kubectl get services
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
kubectl get services
kubectl describe services/kubernetes-bootcamp
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
kubectl describe deployment
kubectl get pods -l run=kubernetes-bootcamp
kubectl get services -l run=kubernetes-bootcamp
export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME
kubectl label pod $POD_NAME app=v1
kubectl describe pods $POD_NAME
kubectl get pods -l app=v1
kubectl delete service -l run=kubernetes-bootcamp
kubectl get services
curl $(minikube ip):$NODE_PORT
kubectl exec -ti $POD_NAME curl localhost:8080
```
擴縮應用程序
在之前的模塊中,我們創(chuàng)建了一個?Deployment膏潮,然后通過?Service讓其可以開放訪問锻狗。Deployment 僅為跑這個應用程序創(chuàng)建了一個 Pod。 當流量增加時焕参,我們需要擴容應用程序滿足用戶需求轻纪。
擴縮?是通過改變 Deployment 中的副本數量來實現(xiàn)的。
擴展 Deployment 將創(chuàng)建新的 Pods叠纷,并將資源調度請求分配到有可用資源的節(jié)點上刻帚,收縮 會將 Pods 數量減少至所需的狀態(tài)。Kubernetes 還支持 Pods 的自動縮放涩嚣,但這并不在本教程的討論范圍內崇众。將 Pods 數量收縮到0也是可以的掂僵,但這會終止 Deployment 上所有已經部署的 Pods。
運行應用程序的多個實例需要在它們之間分配流量顷歌。服務 (Service)有一種負載均衡器類型锰蓬,可以將網絡流量均衡分配到外部可訪問的 Pods 上。服務將會一直通過端點來監(jiān)視 Pods 的運行眯漩,保證流量只分配到可用的 Pods 上芹扭。
```
kubectl get deployments
kubectl get rs
kubectl scale deployments/kubernetes-bootcamp --replicas=4
kubectl get deployments
kubectl get pods -o wide
kubectl describe deployments/kubernetes-bootcamp
kubectl describe services/kubernetes-bootcamp
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
kubectl scale deployments/kubernetes-bootcamp --replicas=2
kubectl get deployments
kubectl get pods -o wide
```
與應用程序擴展類似,如果公開了 Deployment赦抖,服務將在更新期間僅對可用的 pod 進行負載均衡舱卡。可用 Pod 是應用程序用戶可用的實例队萤。
滾動更新允許以下操作:
將應用程序從一個環(huán)境提升到另一個環(huán)境(通過容器鏡像更新)
回滾到以前的版本
持續(xù)集成和持續(xù)交付應用程序轮锥,無需停機
```
kubectl get deployments
kubectl get pods
kubectl describe pods
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
kubectl get pods
kubectl describe services/kubernetes-bootcamp
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
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
```
國內鏡像拉取
https://blog.csdn.net/TinyJian/article/details/109699420
https://www.cnblogs.com/xiangsikai/p/11412897.html
本地鏡像拉取?
minikube ssh
docker info
docker images 這里的docker與外部docker環(huán)境不同,難道需要在這里再次build一個image浮禾?只需要重用docker daemon就可以交胚!
https://stackoverflow.com/questions/42564058/how-to-use-local-docker-images-with-minikube
https://github.com/kubernetes/minikube/blob/0c616a6b42b28a1aab8397f5a9061f8ebbd9f3d9/README.md#reusing-the-docker-daemon
To point your shell to minikube's docker-daemon
eval $(minikube -p minikube docker-env) # for mac; minikube docker-env will show hints for other OS
After execute the command above, "docker info" shows that you currently use the docker in minikube
Using "minikube ssh" to connect minikube and configure registry mirror.
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
? ? "registry-mirrors": ["https://hnrtid7d.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
那怎樣使用原先的docker呢?重新打開一個terminal
在pod yaml文件中可以指定拉取策略imagePullPolicy: IfNotPresent