k8s mysql 配置文件_k8s配置文件模板
一,deployment
Deployment為Pod和Replica Set下一代Replication Controller)提供聲明式更新
1,配置示例
apiVersion: apps/v1 # 1.9.0 之前的版本使用 apps/v1beta2,可通過命令 kubectl api-versions 查看
kind: Deployment #指定創(chuàng)建資源的角色/類型
metadata: #資源的元數(shù)據(jù)/屬性
name: nginx-deployment #資源的名字,在同一個(gè)namespace中必須唯一
namespace: xxxx #命名空間
labels:
app: demo #標(biāo)簽
spec:
replicas: 3 #副本數(shù)量3
strategy:
rollingUpdate: ##由于replicas為3,則整個(gè)升級,pod個(gè)數(shù)在2-4個(gè)之間
maxSurge: 1 #滾動(dòng)升級時(shí)會(huì)先啟動(dòng)1個(gè)pod
maxUnavailable: 1 #滾動(dòng)升級時(shí)允許的最大Unavailable的pod個(gè)數(shù)
selector: #定義標(biāo)簽選擇器,部署需要管理的pod(帶有該標(biāo)簽的的會(huì)被管理)需在pod 模板中定義
matchLabels:
app: web-server
template: #這里Pod的定義
metadata:
labels: #Pod的label
app: web-server
spec: # 模板的規(guī)范
containers:
- name: nginx #容器的名字
image: nginx:1.12.1 #容器的鏡像地址
command: [ "/bin/sh","-c","cat /etc/config/path/to/special-key" ] #啟動(dòng)命令
args: #啟動(dòng)參數(shù)
- '-storage.local.retention=$(STORAGE_RETENTION)'
- '-storage.local.memory-chunks=$(STORAGE_MEMORY_CHUNKS)'
- '-config.file=/etc/prometheus/prometheus.yml'
- '-alertmanager.url=http://alertmanager:9093/alertmanager'
- '-web.external-url=$(EXTERNAL_URL)'
#如果command和args均沒有寫,那么用Docker默認(rèn)的配置。
#如果command寫了,但args沒有寫,那么Docker默認(rèn)的配置會(huì)被忽略而且僅僅執(zhí)行.yaml文件的command(不帶任何參數(shù)的)。
#如果command沒寫,但args寫了,那么Docker默認(rèn)配置的ENTRYPOINT的命令行會(huì)被執(zhí)行,但是調(diào)用的參數(shù)是.yaml中的args。
#如果如果command和args都寫了,那么Docker默認(rèn)的配置被忽略,使用.yaml的配置。
imagePullPolicy: IfNotPresent
# IfNotPresent :默認(rèn)值,本地有則使用本地鏡像,不拉取,如果不存在則拉取
# Always: 總是拉取
# Never: 只使用本地鏡像,從不拉取
livenessProbe:
#表示container是否處于live狀態(tài)。如果LivenessProbe失敗,LivenessProbe將會(huì)通知kubelet對應(yīng)的container不健康了。隨后kubelet將kill掉container,并根據(jù)RestarPolicy進(jìn)行進(jìn)一步的操作。默認(rèn)情況下LivenessProbe在第一次檢測之前初始化值為Success,如果container沒有提供LivenessProbe,則也認(rèn)為是Success;
httpGet:
path: /health #如果沒有心跳檢測接口就為/
port: 8080
scheme: HTTP
initialDelaySeconds: 60 ##啟動(dòng)后延時(shí)多久開始運(yùn)行檢測
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
readinessProbe:
readinessProbe:
httpGet:
path: /health #如果沒有心跳檢測接口就為/
port: 8080
scheme: HTTP
initialDelaySeconds: 30 ##啟動(dòng)后延時(shí)多久開始運(yùn)行檢測
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
resources: ##CPU內(nèi)存限制
requests:
cpu: 2
memory: 2048Mi
limits:
cpu: 2
memory: 2048Mi
env: ##通過環(huán)境變量的方式,直接傳遞pod=自定義Linux OS環(huán)境變量
- name: LOCAL_KEY #本地Key
value: value
- name: CONFIG_MAP_KEY #局策略可使用configMap的配置Key,
valueFrom:
configMapKeyRef:
name: special-config #configmap中找到name為special-config
key: special.type #找到name為special-config里data下的key
ports:
- name: http
containerPort: 8080 #對service暴露端口
volumeMounts: #掛載volumes中定義的磁盤
- name: log-cache
mount: /tmp/log
- name: sdb #普通用法,該卷跟隨容器銷毀,掛載一個(gè)目錄
mountPath: /data/media
- name: nfs-client-root #直接掛載硬盤方法,如掛載下面的nfs目錄到/mnt/nfs
mountPath: /mnt/nfs
- name: example-volume-config #高級用法第1種,將ConfigMap的log-script,backup-script分別掛載到/etc/config目錄下的一個(gè)相對路徑path/to/...下,如果存在同名文件,直接覆蓋。
mountPath: /etc/config
- name: rbd-pvc #高級用法第2中,掛載PVC(PresistentVolumeClaim)
#使用volume將ConfigMap作為文件或目錄直接掛載,其中每一個(gè)key-value鍵值對都會(huì)生成一個(gè)文件,key為文件名,value為內(nèi)容,
volumes: # 定義磁盤給上面volumeMounts掛載
- name: log-cache
emptyDir: {}
- name: sdb #掛載宿主機(jī)上面的目錄
hostPath:
path: /any/path/it/will/be/replaced
- name: example-volume-config # 供ConfigMap文件內(nèi)容到指定路徑使用
configMap:
name: example-volume-config #ConfigMap中名稱
items:
- key: log-script #ConfigMap中的Key
path: path/to/log-script #指定目錄下的一個(gè)相對路徑path/to/log-script
- key: backup-script #ConfigMap中的Key
path: path/to/backup-script #指定目錄下的一個(gè)相對路徑path/to/backup-script
- name: nfs-client-root #供掛載NFS存儲(chǔ)類型
nfs:
server: 10.42.0.55 #NFS服務(wù)器地址
path: /opt/public #showmount -e 看一下路徑
- name: rbd-pvc #掛載PVC磁盤
persistentVolumeClaim:
claimName: rbd-pvc1 #掛載已經(jīng)申請的pvc磁盤
2,相關(guān)使用
一個(gè)典型的用例如下:
使用Deployment來創(chuàng)建ReplicaSet。ReplicaSet在后臺(tái)創(chuàng)建pod。檢查啟動(dòng)狀態(tài),看它是成功還是失敗。
然后,通過更新Deployment的PodTemplateSpec字段來聲明Pod的新狀態(tài)。這會(huì)創(chuàng)建一個(gè)新的ReplicaSet,Deployment會(huì)按照控制的速率將pod從舊的ReplicaSet移動(dòng)到新的ReplicaSet中。
如果當(dāng)前狀態(tài)不穩(wěn)定,回滾到之前的Deployment revision。每次回滾都會(huì)更新Deployment的revision。
擴(kuò)容Deployment以滿足更高的負(fù)載。
暫停Deployment來應(yīng)用PodTemplateSpec的多個(gè)修復(fù),然后恢復(fù)上線。
根據(jù)Deployment 的狀態(tài)判斷上線是否hang住了。
清除舊的不必要的ReplicaSet
創(chuàng)建deployment
kubectl create -f nginx-deployment.yaml --record ##--record 為True 在annotation中記錄當(dāng)前命令創(chuàng)建或者升級了該資源,如查看在每個(gè)Deployment revision中執(zhí)行了哪些命令
kubectl get deployments
kubectl get rs #Replica Set的名字總是-
kubectl get pods -n xxxx #命名空間
kubectl get pods --show-labels #查看標(biāo)簽
更新deployment
注意: Deployment的rollout當(dāng)且僅當(dāng)Deployment的pod template(例如.spec.template)中的label更新或者鏡像更改時(shí)被觸發(fā)。其他更新,例如擴(kuò)容Deployment不會(huì)觸發(fā)rollout.
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1 #更新鏡像
或使用edit命令來編輯Deployment,修改 .spec.template.spec.containers[0].image ,將nginx:1.7.9 改寫成 nginx:1.9.1
kubectl edit deployment/nginx-deployment
kubectl rollout status deployment/nginx-deployment #rollout狀態(tài)
回退deployment
kubectl describe deployment #查看狀態(tài)
kubectl rollout history deployment/nginx-deployment #檢查升級記錄
kubectl rollout history deployment/nginx-deployment --revision=2 #查看version信息
暫停和恢復(fù)
kubectl get deploy
kubectl rollout pause deployment/nginx-deployment
kubectl set image deploy/nginx nginx=nginx:1.9.1
kubectl rollout history deploy/nginx
二,SERVICE
service 的作用
防止Pod失去聯(lián)系(服務(wù)發(fā)現(xiàn))
定義一組Pod的訪問策略(負(fù)載均衡)
支持ClusterIP,NodePort以及LoadBalancer三種類型
Service的底層實(shí)現(xiàn)主要有iptables和ipvs兩種網(wǎng)絡(luò)模式
pod 與service的關(guān)系
通過lable-selector相關(guān)聯(lián)
通過Service實(shí)現(xiàn)Pod的負(fù)載均衡(TCP/UDP 4層)
配置文件
[root@k8s-master-128 dome]# cat deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels: # 這里是定義Deployment的標(biāo)簽
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx # 選擇關(guān)聯(lián)Deployment標(biāo)簽
template:
metadata:
labels: # 給Pod定義一個(gè)標(biāo)簽,方便其他服務(wù)關(guān)聯(lián)這個(gè)Pod
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector: # Service 的selector 指定標(biāo)簽 app:nginx 來進(jìn)行對Pod進(jìn)行關(guān)聯(lián) ;(這里的app:nginx就是上面Deployment配置里labels定義的標(biāo)簽 )
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
Service的三種類型
ClusterIP
分配一個(gè)內(nèi)部集群IP地址,只能在集群內(nèi)部訪問(同Namespaces內(nèi)的Pod),不對外提供訪問服務(wù)!默認(rèn)ServiceTpye
kubectl get svc 暴露的集群ip和集群端口,只能在k8s集群內(nèi)部訪問
Node節(jié)點(diǎn)上能查看到創(chuàng)建的iptables規(guī)則
Nodeport
分配一個(gè)內(nèi)網(wǎng)集群IP地址,并在內(nèi)個(gè)節(jié)點(diǎn)上啟用一個(gè)端口來暴露服務(wù),可以在集群外部訪問
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80 # 需要暴露的集群端口(service暴露的)
targetPort: 9376 # 容器的端口(后端容器提供服務(wù)的端口)
nodePort: 30000
type: NodePort
映射到物理機(jī)的端口范圍為:The range of valid ports is 30000-32767
kubectl get svc -o wide 暴露的端口在node 節(jié)點(diǎn)上由kube-proxy來啟動(dòng)并監(jiān)聽的,可通過NodeIP+端口的方式直接進(jìn)行訪問,因?yàn)閗ube-proxy進(jìn)行了代理。
kube-proxy是如何代理訪問到容器的呢?因?yàn)閗ube-proxy在啟動(dòng)的時(shí)候通過--proxy-mode=ipvs可以指定底層內(nèi)核代理模式,默認(rèn)是iptables進(jìn)行代理轉(zhuǎn)發(fā),kube-proxy通過這兩種模式來代理直接對外提供服務(wù)
參考的寫法
apiVersion: v1
kind: Pod
metadata:
name: eureka
labels:
ccb: eureka
spec:
containers:
- name: test-container
image: eureka
ports:
- name: eureka
containerPort: 8082
protocol: TCP
imagePullPolicy: Never
volumeMounts:
- name: appconfig
mountPath: /jar/application.yml
subPath: application.yml
volumes:
- name: appconfig
configMap:
name: insight-application
items:
- key: registry-application.yml
path: application.yml
restartPolicy: Never
---
apiVersion: v1
kind: Service
metadata:
name: eureka
labels:
ccb: eureka
spec:
ports:
- port: 8082
targetPort: 8082
protocol: TCP
nodePort: 30000
type: NodePort
selector:
ccb: eureka
LoadBalancer
分配一個(gè)內(nèi)部集群IP地址,并在每個(gè)節(jié)點(diǎn)上啟用一個(gè)端口來暴露服務(wù)。
除此之外,Kubernetes會(huì)請求底層云平臺(tái)上的負(fù)載均衡器,將每個(gè)Node([NodeIP]:[NodePort])作為后端添加進(jìn)去。
LoadBalancer只適用于云平臺(tái),AWS默認(rèn)就支持,阿里云社區(qū)開發(fā)也支持
Service代理模式
service有三組代理模式:userspace、iptables和ipvs
常用命令
kubectl get svc -o wide
kubectl describe pod nginx-deployment-6dd86d77d-kxkmt #注意命名空間
三,定義pod
apiVersion: v1
kind: Pod
metadata:
name: eureka
labels:
ccb: eureka
spec:
containers:
- name: test-container
image: eureka
ports:
- name: eureka
containerPort: 8082
protocol: TCP
imagePullPolicy: Never #使用本地鏡像
volumeMounts:
- name: appconfig
mountPath: /jar/application.yml
subPath: application.yml
volumes:
- name: appconfig
configMap:
name: insight-application
items:
- key: registry-application.yml
path: application.yml
restartPolicy: Never
---
apiVersion: v1
kind: Service
metadata:
name: eureka
labels:
ccb: eureka
spec:
ports:
- port: 8082 #集群開放的的端口
targetPort: 8082 #后端容器開放的端口
protocol: TCP
nodePort: 30000 #宿主機(jī)開放的端口,范圍大于30000
type: NodePort #指定service類型為暴露物理節(jié)點(diǎn)的端口,必須
selector:
ccb: eureka #service 管理的pod
1,創(chuàng)建pod流程
用戶通過kubectl命令創(chuàng)建一個(gè)Pod的流程:
客戶端提交創(chuàng)建請求,可以通過API Server的Restful API,也可以使用kubectl工具,支持json和yaml格式;
Api Server處理用戶請求,存儲(chǔ)Pod信息數(shù)據(jù)到etcd集群中;
Scheduler調(diào)度器通過API Server查看未綁定的Pod,嘗試為Pod進(jìn)行分配主機(jī),通過調(diào)度算法選擇主機(jī)后,綁定到這臺(tái)機(jī)器上并且把調(diào)度信息寫入etcd集群;
kubelet根據(jù)調(diào)度結(jié)果執(zhí)行Pod創(chuàng)建操作,成功后將信息通過Api Server更新到etcd集群中;
整個(gè)Pod創(chuàng)建過程完成,每個(gè)組件都在于Api Server進(jìn)行交互,Api Server就是k8s集群的中間者,組件之間的協(xié)同者,是一個(gè)集群訪問入口
2,Pod的多種控制器
ReplicaSet: 代用戶創(chuàng)建指定數(shù)量的pod副本數(shù)量,確保pod副本數(shù)量符合預(yù)期狀態(tài),并且支持滾動(dòng)式自動(dòng)擴(kuò)容和縮容功能。
ReplicaSet主要三個(gè)組件組成:
用戶期望的pod副本數(shù)量
標(biāo)簽選擇器,判斷哪個(gè)pod歸自己管理
當(dāng)現(xiàn)存的pod數(shù)量不足,會(huì)根據(jù)pod資源模板進(jìn)行新建幫助用戶管理無狀態(tài)的pod資源,精確反應(yīng)用戶定義的目標(biāo)數(shù)量,但是RelicaSet不是直接使用的控制器,而是使用Deployment。
Deployment:工作在ReplicaSet之上,用于管理無狀態(tài)應(yīng)用,目前來說最好的控制器。支持滾動(dòng)更新和回滾功能,還提供聲明式配置。 參考文章:https://blog.csdn.net/bbwangj/article/details/82011573
DaemonSet:用于確保集群中的每一個(gè)節(jié)點(diǎn)只運(yùn)行特定的pod副本,通常用于實(shí)現(xiàn)系統(tǒng)級后臺(tái)任務(wù),比如ingress,elk.服務(wù)是無狀態(tài)的,服務(wù)必須是守護(hù)進(jìn)程。參考文章:https://www.cnblogs.com/xzkzzz/p/9553321.html
Job:只要任務(wù)或程序運(yùn)行完成就立即退出,不需要重啟或重建。 參考文章:https://blog.csdn.net/bbwangj/article/details/82011610
Cronjob:周期性任務(wù)控制,執(zhí)行后就退出, 不需要持續(xù)后臺(tái)運(yùn)行, 參考文章:https://blog.csdn.net/bbwangj/article/details/82867830
StatefulSet:管理有狀態(tài)應(yīng)用,比如redis,mysql
3,POD管理
# 創(chuàng)建Pod資源
$ kubectl create -f pod.yaml
# 查看pods
$ kubectl get pods nginx-pod
# 查看pod描述
$ kubectl describe pod/nginx-pod
# 更新資源
$ kubectl apply -f pod.yaml
# 刪除資源
$kubectl delete -f pod.yaml
or
$kubectl delete pods nginx-pod
4,資源限制
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
resources: # 資源限制標(biāo)簽
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
requests和limits都是做資源限制的,他們的區(qū)別在于:
requests # pod在創(chuàng)建時(shí)向k8s請求的資源大小;
limits # 限制了這個(gè)Pod運(yùn)行的最大資源空間;
5,調(diào)度約束
Pod.spec.nodeName # 強(qiáng)制約束Pod調(diào)度到指定Node節(jié)點(diǎn)上
Pod.spec.nodeSelector # 通過lable-selector機(jī)制選擇節(jié)點(diǎn)
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
# nodeName:node01
nodeSelector:
env_role: dev
containers:
- name: nginx
image: nignx
通過label給Node主機(jī)設(shè)置標(biāo)簽:
kubectl label nodes k8s-node-129 env_role=dev
通過–show-labels查看Node的標(biāo)簽:
$ kubectl get node --show-labels
6,重啟策略
Always: 當(dāng)容器停止,總是重建容器,默認(rèn)策略。
OnFailure: 當(dāng)容器異常退出(退出狀態(tài)碼非0)時(shí),才重啟容器。
Never:當(dāng)容器終止退出,從不重啟容器。
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
restartPolicy: OnFailure
7,鏡像拉取策略
IfNotPresent:默認(rèn)值,鏡像不存在宿主機(jī)上時(shí)才拉取
Always:每次創(chuàng)建Pod時(shí)都會(huì)重新拉取一次鏡像
Never:Pod永遠(yuǎn)不會(huì)主動(dòng)拉取這個(gè)鏡像
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
8,健康檢查
提供Probe機(jī)制,有以下兩種類型:
livenessProbe
如果檢查失敗,將容器殺死,根據(jù)Pod的restartPolicy來操作。
readinessProbe
如果檢查失敗,Kubeneres會(huì)把Pod從service endpoints中剔除。
robe支持以下三種檢查方法:
httpGet
發(fā)送HTTP請求,返回200-400范圍狀態(tài)碼為成功。
exec
執(zhí)行Shell命令返回狀態(tài)碼是0為成功。
tcpSocket
發(fā)起TCP Socket建立成功。
9,問題定位
kubectl describe type/name
kubectl logs type/name [-c container]
kubectl exec --namespace=xxx -it pod -C 容器名稱 -- bash
快速生成YAML文件
1,命令生成
$ kubectl run --image=nginx my-deploy -o yaml --dry-run >my-deploy.yaml
$ kubectl create -f deploy-nginx.yaml -o yaml --dry-run >my-deploy.yaml
$ kubectl create -f deploy-nginx.yaml -o json --dry-run >my-deploy.json # 指定輸出json格式
– image # 指定模板鏡像
my-deploy # 運(yùn)行標(biāo)簽名稱
–dry-run # 只測試運(yùn)行,不會(huì)實(shí)際運(yùn)行pod
-o yaml # 指定輸出格式
2,get導(dǎo)出
kubectl get deploy/my-deploy -o=yaml --export > my-deploy.yaml
3,查詢Pod容器的字段資源內(nèi)部文檔
使用kubectl explain –help 查詢pod字段內(nèi)部說明
$ kubectl explain pods # 每一個(gè)層級的指令都會(huì)有字段信息
$ kubectl explain pods.spec
$ kubectl explain pods.spec.containers
與50位技術(shù)專家面對面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的k8s mysql 配置文件_k8s配置文件模板的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: aspx mysql类_aspx中的my
- 下一篇: mac系统python写文件_Mac中p