k8s搭建一個lnmp本地環境的完整過程
1.安裝k8s
本機使用了Mac下的Docker Desktop下的k8s環境。
k8s鏡像國內下載:Docker Desktop for Mac/Windows 開啓 Kubernetes
php
Dashboard登陸Token過時時間修改
本地測試TOKEN是否是常常過時?在構建文件recommended.yaml的–namespace=kubernetes-dashboard下增長一行ttl便可。
已經啓動了怎麼辦?修改已經啓動yaml文件,大概在143行下新增ttl。
html
kubectl edit deployment -n kubernetes-dashboard
2.基本概念介紹
1.架構核心組件瞭解
k8s使用相似master/node(cluster)的模型,由客戶端發送請求給master的api server,master的api server收到請求後查詢ETCD的變更,ETCD進行Controller Manager和Scheduler內部調度後返回給api server,最後轉發給對應的node去執行。
圖片來源B站UP主:free-coder的【kubernetes入門】快速瞭解和上手容器編排工具k8s
node
客戶端請求方式 | 描述 |
---|---|
kubectl | 命令行工具 |
webUI | 經過Dashboard操做發出請求 |
RestAPI | 自定義,能夠給webUI增長功能。 |
master組件 | 描述 |
---|---|
api server | 資源操做的惟一入口,提供認證、受權、訪問控制、API 註冊和發現等機制。 |
ETCD | 保存整個集羣的狀態,Raft分佈式的kv數據庫 |
Controller Manager | 資源控制中心,維護集羣的狀態,好比故障檢測、自動擴展、滾動更新等 |
Scheduler | 調度的主要實施者,按照預約的調度策略將 Pod 調度到相應的機器上 |
node組件 | 描述 |
---|---|
kubelet | 維護容器的生命週期,同時也負責 Volume(CVI)和網絡(CNI)的管理 |
kube-proxy | 爲 Service 提供 cluster 內部的服務發現和負載均衡 |
container runtime | 鏡像管理以及 Pod 和容器的真正運行(CRI ),被調度的實際容器(docker) |
更多請參考Kubernetes指南 核心組件mysql
2.資源對象瞭解
類型 | 資源名 | 描述 |
---|---|---|
集羣 | Namespace | 命名空間起隔離做用,初始化有default和kube-system,方便劃分項目組或用戶組 |
集羣 | Node | Pod真正運行的主機,必定包含kubelet、kube-proxy、Container runtime |
工做資源 | POD | 調度的基本單位,多個容器共享網絡和文件系統,共享IPC、PID、network和namespace |
工做資源 | ReplicaSet | 新一代RC(Replication Controller),保證集羣中運行指定數目的Pod副本 |
工做資源 | Deployment | 部署表示用戶對K8s集羣的一次更新操做,聲明式操做。 |
工做資源 | StatefulSet | 有狀態服務集,確保pod與數據保持連續性,適合跑mysql等掛載數據的服務 |
工做資源 | DaemonSet | 後臺支撐服務集,有些節點須要有些節點不須要的,存儲、日誌和監控等在每一個節點上支撐K8s集羣運行的服務。 |
工做資源 | Job | 任務,全局的工做隊列,控制批處理型任務的API對象。 |
服務發現及均衡資源 | Service | 將多個pod抽象爲一個ServiceIP(iptables),經過 labels 爲應用提供負載均衡和服務發現,解決Pod 的 IP 地址會隨着 Pod 的重啓而變化的問題 |
服務發現及均衡資源 | Ingress | 路由,進入集羣的請求提供路由規則的集合,給 service 提供集羣外部訪問的 URL、負載均衡、SSL 終止、HTTP 路由等 |
配置與存儲 | Volume | 讓k8s具有存儲資源抽象能力,其中持久存儲卷(Persistent Volume,PV)由資源提供者配置,持久存儲卷聲明(Persistent Volume Claim,PVC)由資源使用者根據業務申請 |
配置與存儲 | ConfigMap | 用於保存配置數據的鍵值對,相比secret能夠保存非敏感信息 |
配置與存儲 | Secret | 解決了密碼、token、密鑰等敏感數據的配置問題,不須要暴露到鏡像或pod裏。 |
更多請參考Kubernetes指南 資源nginx
3.lnmp構建文件介紹
github源碼地址git
. ├── kustomization.yaml #整合多套生產、開發的yaml文件方便管理。 ├── local-storage.yaml #經過hostPath建立PV和PVC ├── local_storage │ ├── mysql #數據持久化目錄 │ └── wordpress #應用代碼持久化目錄 ├── mysql-deployment.yaml #mysql的svc和Deployment管理的pod ├── nginx-deployment.yaml #與上相似,多了ConfigMap管理配置和LoadBalancer直接暴露IP。 ├── php-deployment.yaml #與上相似 └── php-fpm └── Dockerfile #裝了mysql擴展的php鏡像
本地環境設置分兩部分:github
- 鏡像拉去imagePullPolicy: Never ,鏡像優先從本地倉庫查找。
- PV設置hostPath的絕對路徑。
- 同一個下PVC使用不一樣的目錄subPath。
生成帶mysql擴展的php鏡像,提供給k8s使用。web
docker build -t k8s-php7-fpm php-fpm/.
運行kustomization.yaml文件便可。redis
kubectl apply -k .
4.kubectl經常使用命令
相似對pod命令,也對deployment、Service、PVC等資源適用,能夠觸類旁通。sql
kubectl cluster-info #查詢集羣運行信息、版本。 kubectl apply -f test.yaml #部署指定文件,--file kubectl delete -f test.yaml #取消部署 kubectl run d1 --image httpd:alpine --port 80 #建立d1的Apache鏡像 kubectl exec -it redis-master-59694fd4d5-txcbc sh #以sh進入容器 kubectl logs -f redis-master-59694fd4d5-txcbc #查看運行時容器內的log kubectl get - 相似於 docker ps,查詢資源列表 kubectl describe - 相似於 docker inspect,獲取資源的詳細信息 kubectl logs - 相似於 docker logs,獲取容器的日誌 kubectl exec - 相似於 docker exec,在容器內執行一個命令 kubectl get pod --output=wide #更多的pod信息 kubectl get pods -A #--all-namespaces全部命名空間下的pod kubectl describe pods #更詳細的pods信息 kubectl get pods -w -l #watch命令,掛起觀察 kubectl get events -A --sort-by='.metadata.creationTimestamp' #查詢運行時事件倒序 kubectl expose deployment d1 --target-port 80 --type NodePort #將d1暴露爲一個svc,指定80端口和NodePort類型。 kubectl scale --replicas=3 deployment/nginx-app #自動擴容到3個,自動加入退出service。 kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2 #滾動升級,默認,無中斷服務升級 kubectl rolling-update frontend-v1 frontend-v2 --rollback #回滾 kubectl rollout status deployment/nginx-app #查看滾動狀態 for i in 0 5; do kubectl exec "web-$i" -- sh -c 'hostname'; done #循環打印web-0到5容器的的hostname for i in 0 5; do kubectl exec "web-$i" -- sh -c 'echo "$(hostname)" > /usr/share/nginx/html/index.html'; done #寫入nginx hostname
5.遇到的坑
Docker Desktop for Mac : Kubernetes is starting
重寫構建驗證包,重啓k8s,耐心等待幾分鐘。
rm -rf ~/Library/Group\ Containers/group.com.docker/pki/