kubernetes 安裝
[root@master ~]# curl -O ftp://172.100.0.11/2-iso/chinaskills_cloud_paas_v2.0.2.iso
[root@master ~]# mount -o loop chinaskills_cloud_paas_v2.0.2.iso /mnt/
[root@master ~]# cp -rvf /mnt/* /opt/
[root@master ~]# umount /mnt/
[root@master ~]# mv /opt/kubeeasy /usr/bin/
[root@master ~]# kubeeasy install dependencies --host 172.100.0.22,172.100.0.23 --user root --password 000000 --offline-file /opt/dependencies/base-rpms.tar.gz # 安裝依賴
[root@master ~]# kubeeasy check ssh --host 172.100.0.22,172.100.0.23 --user root --password 000000 # 測(cè)試連通性
[root@master ~]# kubeeasy create ssh-keygen --master 172.100.0.22 --worker 172.100.0.23 --user root --password 000000 # 配置免密鑰
[root@master ~]# kubeeasy install kubernetes --master 172.100.0.22 --worker 172.100.0.23 --user root --password 000000? --version 1.22.1? --offline-file /opt/kubernetes.tar.gz # 安裝Kubernetes
[root@master ~]# kubeeasy add --virt kubevirt # 安裝Kubevirt
[root@master ~]# kubeeasy add --istio istio # 安裝Istio
[root@master ~]# kubeeasy add --registry harbor # 安裝harbor、docker-compose践叠、helm
# 添加節(jié)點(diǎn)
[root@master ~]# kubeeasy install depend --host 172.100.0.25 --user root --password 000000 --offline-file /opt/dependencies/base-rpms.tar.gz
[root@master ~]# kubeeasy add --worker 172.100.0.25 --user root --password 000000 --offline-file /opt/kubernetes.tar.gz
kubernetes 運(yùn)維
1. 使用 kubectl 自帶排序功能茬射,列出集群內(nèi)所有的 Pod辆床,并以 name 字段排序贺喝。
[root@k8s-master-node1 ~]# kubectl get pod -A --sort-by=.metadata.name
2. 集群部署完成后,檢查集群所有證書過期時(shí)間怎栽。
[root@k8s-master-node1 ~]# kubeadm certs check-expiration
3. 集群部署完成后颊亮,查看所有節(jié)點(diǎn)的運(yùn)行狀態(tài)及標(biāo)簽
[[root@k8s-master-node1 ~]# kubectl get nodes -o wide --show-labels
4. 集群部署完成,后查看集群所有的資源信息场勤。
[root@k8s-master-node1 ~]# kubectl get all -A
5. 集群部署完成后戈锻,查看整個(gè)集群的配置信息。
[root@k8s-master-node1 ~]# kubectl cluster-info
6. 集群部署完成后和媳,為集群創(chuàng)建一個(gè)永久時(shí)效的 Token格遭。
[root@k8s-master-node1 ~]# kubeadm token create --ttl=0
[root@k8s-master-node1 ~]# kubeadm token list
7. 集群部署完成后,查看當(dāng)前集群支持的所有 API resources留瞳。
[root@k8s-master-node1 ~]# kubectl api-resources --namespaced=true
8. 集群部署完成后拒迅,查看命名空間 kube-system 內(nèi)所有資源的信息。
[root@k8s-master-node1 ~]# kubectl get all -n kube-system
9. 使用 kubectl 自帶排序功能列出集群內(nèi)所有的 Service 并以 name 字段排序她倘。
[root@k8s-master-node1 ~]# kubectl get svc? -A? --sort-by=.metadata.name
10.調(diào)度master節(jié)點(diǎn)
[root@k8s-master-node1 ~]# kubectl describe nodes k8s-master-node1? ?
[root@k8s-master-node1 ~]# kubectl taint node k8s-master-node1 node-role.kubernetes.io/master-
[root@k8s-master-node1 ~]# kubectl describe nodes k8s-master-node1
[root@k8s-master-node1 ~]# kubectl taint node k8s-master-node node-role.kubernetes.ip/master:NoSchedule
NoSchedule :表示 k8s 將不會(huì)將 Pod 調(diào)度到具有該污點(diǎn)的 Node 上
PreferNoSchedule :表示 k8s 將盡量避免將 Pod 調(diào)度到具有該污點(diǎn)的 Node 上
NoExecute :表示 k8s 將不會(huì)將 Pod 調(diào)度到具有該污點(diǎn)的 Node 上璧微,同時(shí)會(huì)將 Node 上已經(jīng)存在的 Pod 驅(qū)逐出去
11.Pod動(dòng)態(tài)擴(kuò)容和縮放
[root@k8s-master-node1 ~]# kubectl get deployment? ?
[root@k8s-master-node1 ~]# kubectl scale deployment nginx --replicas=2
12.滾動(dòng)升級(jí)和回滾
[root@k8s-master-node1 ~]# kubectl apply -f deployment.yaml --record
[root@k8s-master-node1 ~]# kubectl rollout history deployment nginx-app
[root@k8s-master-node1 ~]# kubectl set image deployment/nginx-app container=172.100.0.22/library/nginx:latest
[root@k8s-master-node1 ~]# kubectl rollout status deployment/nginx-app
[root@k8s-master-node1 ~]# kubectl rollout undo deployment/nginx-app
[root@k8s-master-node1 ~]# kubectl rollout undo deployment/nginx-app --to-revision=3
更改yaml
[root@k8s-master-node1 ~]# kubectl rolling-update redis -f redis-rc.update.yaml
[root@k8s-master-node1 ~]# kubeclt rolling-update redis --image=redis-2.0
13.Node的隔離與恢復(fù)
隔離操作
[root@k8s-master-node1 ~]# kubectl cordon node
[root@k8s-master-node1 ~]# kubectl get nodes?
恢復(fù)node的調(diào)度狀態(tài)
[root@k8s-master-node1 ~]# kubectl uncordon node
[root@k8s-master-node1 ~]# kubectl get nodes
驅(qū)逐node
[root@k8s-master-node1 ~]# kubectl get pods -o wide? ? node節(jié)點(diǎn)運(yùn)行有一個(gè)pod
[root@k8s-master-node1 ~]# kubectl drain node?
14.將Pod調(diào)度到指定的Node
[root@k8s-master-node1 ~]# kubectl get nodes
[root@k8s-master-node1 ~]# kubectl label nodes node test=123
[root@k8s-master-node1 ~]# kubectl label nodes node test-?
[root@k8s-master-node1 ~]# kubectl get node --show-labels
[root@k8s-master-node1 ~]# vim deploy-httpv1.yaml
spec.nodeSelector:? ? ? ? //在pod標(biāo)簽下
? test: 123
[root@k8s-master-node1 ~]# kubectl apply -f deploy-httpv1.yaml
[root@k8s-master-node1 ~]# kubectl get pods -o wide
15.Kubernetes 默認(rèn)每個(gè)節(jié)點(diǎn)只能啟動(dòng) 110 個(gè) Pod,由于業(yè)務(wù)需要硬梁,將每個(gè)節(jié)點(diǎn)默認(rèn)限制的Pod 數(shù)量改為 200前硫。
k8s-master-node1節(jié)點(diǎn):
[root@k8s-master-node1 ~]# vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
添加以下內(nèi)容:
Environment="KUBELET_NODE_MAX_PODS=--max-pods=200"
文末添加:
$KUBELET_CONFIG_MAX_PODS
[root@k8s-master-node1 ~]# systemctl daemon-reload? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
[root@k8s-master-node1 ~]# systemctl restart kubelet
[root@k8s-master-node1 ~]# kubectl describe node master node|grep -w pods|grep 200|wc -l
k8s-worker-node1節(jié)點(diǎn):
[root@k8s-worker-node1 ~]# vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
添加以下內(nèi)容:
Environment="KUBELET_NODE_MAX_PODS=--max-pods=200"
文末添加:
$KUBELET_CONFIG_MAX_PODS
[root@k8s-worker-node1 ~]# systemctl daemon-reload? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
[root@k8s-worker-node1 ~]# systemctl restart kubelet
16.Kubernetes 以 NodePort 方式暴露服務(wù),默認(rèn)的端口范圍為 30000-32767荧止,將 NodePort的端口范圍修改為 20000-65535屹电。
k8s-master-node1節(jié)點(diǎn):
[root@k8s-master-node1 ~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
- --service-node-port-range=20000-65535
[root@k8s-master-node1 ~]# kubectl describe pod $apiserver_pods -n kube-system |grep service
17.升級(jí)系統(tǒng)內(nèi)核:
[root@k8s-master-node1 ~]# yum localinstall -y kernel-lt-devel-5.4.193-1.el7.elrepo.x86_64.rpm kernel-lt-5.4.193-1.el7.elrepo.x86_64.rpm
[root@k8s-master-node1 ~]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg # 查看內(nèi)核排序
[root@k8s-master-node1 ~]# vim /etc/default/grub # 修改內(nèi)核啟動(dòng)參數(shù)為
GRUB_DEFAULT=0
[root@k8s-master-node1 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg # 使用grub2-mkconfig命令來重新創(chuàng)建內(nèi)核配置
[root@k8s-master-node1 ~]# reboot
[root@k8s-master-node1 ~]# uname -r
18.切換網(wǎng)絡(luò)類型:
[root@k8s-master-node1 ~]# cat /etc/cni/net.d/10-flannel.conflist # 查看當(dāng)前網(wǎng)絡(luò)類型
[root@k8s-master-node1 ~]# kubectl delete -f /tmp/kubernetes/manifests/kube-flannel.yaml
[root@k8s-master-node1 ~]# ip link delete cni0 # master節(jié)點(diǎn)刪除網(wǎng)卡cni0
[root@k8s-master-node1 ~]# ip link delete flannel.1 # master節(jié)點(diǎn)刪除網(wǎng)絡(luò)flannel.1
[root@k8s-worker-node1 ~]# ip link delete cni0 # worker節(jié)點(diǎn)刪除網(wǎng)卡cni0
[root@k8s-worker-node1 ~]# ip link delete flannel.1 # worker節(jié)點(diǎn)刪除網(wǎng)絡(luò)flannel.1
[root@k8s-master-node1 ~]# vim /opt/kubernetes/manifests/calico.yaml? # 更改鏡像地址
19.開啟k8s的ipvs模式
[root@k8s-master-node1 ~]# kubectl get? cm -n kube-system? # 查看配置文件注釋中心存放的文件列表
[root@k8s-master-node1 ~]# kubectl edit? cm -n kube-system kube-proxy? # 修改kube-proxy
mode: "ipvs"
[root@k8s-master-node1 ~]# kubectl get pod -n kube-system | grep kube-proxy?
[root@k8s-master-node1 ~]# kubectl delete pod -n kube-system kube-proxy-8ghd7 kube-proxy-bsjjs
查看是否修改成功
[root@k8s-master-node1 ~]# kubectl get pod -n kube-system | grep kube-proxy kube-proxy-9sxnn
[root@k8s-master-node1 ~]# kubectl logs -n kube-system? kube-proxy-9sxnn?
I0121 07:56:56.645925? ? ? 1 server_others.go:259] Using ipvs Proxier.? //代表成功
自動(dòng)創(chuàng)建LVS集群? ? ? 以前模式是采用IPtable防火墻來實(shí)現(xiàn)
[root@k8s-master-node1 ~]# ipvsadm -Ln
Kubernetes
[root@k8s-master-node1 ~]# kubectl top nodes --use-protocol-buffers # 查看節(jié)點(diǎn)負(fù)載情況
[root@k8s-master-node1 ~]# kubectl get pod <pod-name> -n <namespace> -o custom-columns=NAME:.metadata.name,"ANNOTATIONS":.metadata.annotations # 以自定義列顯示Pod信息
[root@k8s-master-node1 ~]#? kubectl get pods <pod-name> -o=custom-columns-file=template.txt # 基于文件的自定義列名輸出
Istio:
可視化:
Grafana http://master_IP:33000
Prometheus http://master_IP:30090
Jaeger http://master_IP:30686
Kiali http://master_IP:20001
[root@k8s-master-node1 ~]# istioctl profile list # 查看istioctl可以訪問到的Istio配置檔的名稱
[root@k8s-master-node1 ~]# istioctl profile dump dem # 查看配置檔的配置信息
[root@k8s-master-node1 ~]# istioctl profile diff default demo # 查看配置文件的差異
[root@k8s-master-node1 ~]# istioctl proxy-status # 概覽服務(wù)網(wǎng)格
[root@k8s-master-node1 ~]# istioctl proxy-config cluster <pod-name> [flags] # 檢索特定Pod中Envoy實(shí)例的集群配置的信息:
[root@k8s-master-node1 ~]# istioctl proxy-config bootstrap <pod-name> [flags] # 檢索特定Pod中Envoy實(shí)例的bootxtrap配置的信息:
[root@k8s-master-node1 ~]# istioctl proxy-config listener <pod-name> [flags] # 檢索特定Pod中Envoy實(shí)例的監(jiān)聽器配置的信息:
[root@k8s-master-node1 ~]# istioctl proxy-config route <pod-name> [flags] # 檢索特定Pod中Envoy實(shí)例的路由配置的信息:
[root@k8s-master-node1 ~]# istioctl proxy-config endpoints <pod-name> [flags] # 檢索特定Pod中Envoy實(shí)例的端點(diǎn)配置的信息:
Harbor:
[root@k8s-master-node1 ~]# systemctl status harbor # 查看harbor狀態(tài)
Helm:
[root@k8s-master-node1 ~]# helm version # 查看版本信息
[root@k8s-master-node1 ~]# helm list # 查看當(dāng)前安裝的Charts
[root@k8s-master-node1 ~]# helm search <chart-name> # 查找Charts
[root@k8s-master-node1 ~]# helm status redis # 查看Charts狀態(tài)
[root@k8s-master-node1 ~]# helm delete --purge <chart-name> # 刪除Charts
[root@k8s-master-node1 ~]# helm create helm_charts # 創(chuàng)建Charts
[root@k8s-master-node1 ~]# helm lint # 測(cè)試Charts語法
[root@k8s-master-node1 ~]# cd helm_charts && helm package ./ # 打包Charts
[root@k8s-master-node1 ~]# helm template helm_charts-xxx.tgz # 查看生成的yaml文件
container
pod
1. 在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 pod-init.yaml 創(chuàng)建 Pod,具體要求如下:
(1)Pod 名稱:pod-init跃巡;
(2)鏡像:busybox危号;
(3)添加一個(gè) Init Container,Init Container 的作用是創(chuàng)建一個(gè)空文件素邪;
(4)Pod 的 Containers 判斷文件是否存在外莲,不存在則退出。
[root@k8s-master-node1 ~]# vim pod-init.yaml
apiVersion: v1
kind: Pod
metadata:
? name: pod-init
spec:
? containers:
? - name: con
? ? image: 172.100.0.22/library/busybox:latest
? ? command: ["test", "-e", "/tmp/test"]
? initContainers:
? - name: init-con
? ? image: 172.100.0.22/library/busybox:latest
? ? command: ["/bin/sh", "-c", "touch /tmp/test"]
? restartPolicy: Never
2.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 pod-live.yaml 創(chuàng)建 Pod兔朦,具體要求如下:
(1)Pod 名稱:liveness-exec偷线;
(2)鏡像:busybox磨确;
(3)啟動(dòng)命令:/bin/sh -c "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy;
(4)在容器內(nèi)執(zhí)行命令“cat /tmp/healthy”來進(jìn)行存活探測(cè)淋昭,每 5 秒執(zhí)行一次俐填。
(5)啟動(dòng)后延時(shí) 5 秒開始運(yùn)行檢測(cè)
[root@k8s-master-node1 ~]# vim pod-live-exec.yaml
apiVersion: v1
kind: Pod
metadata:
? name: liveness-exec
spec:
? containers:
? - name: con
? ? image: 172.100.0.22/library/busybox:latest
? ? command: ["/bin/sh", "-c", "touch /tmp/healthy;sleep 30;rm -rf /tmp/healthy"]
? ? livenessProbe:
? ? ? exec:
? ? ? ? command: ["test", "-e", "/tmp/healthy"]
? ? ? initialDelaySeconds: 5
? ? ? periodSeconds : 5
3.在master節(jié)點(diǎn)/root目錄下編寫yaml文件liveness_httpget.yaml,具體要求如下:
(1)Pod名稱:liveness-http翔忽;
(2)命名空間:default英融;
(3)鏡像:nginx;端口:80歇式;
(4)容器啟動(dòng)時(shí)運(yùn)行命令“echo Healty > /usr/share/nginx/html/healthz”驶悟;
(5)httpGet請(qǐng)求的資源路徑為/healthz,地址默認(rèn)為Pod IP材失,端口使用容器中定義的端口名稱HTTP痕鳍;
(6)啟動(dòng)后延時(shí)30秒開始運(yùn)行檢測(cè);
(7)每隔3秒執(zhí)行一次liveness probe
? ? [root@k8s-master-node1 ~]# vim pod-live-get.yaml
apiVersion: v1
kind: Pod
metadata:
? name: liveness-http
? namespace: default
spec:
? containers:
? - name: con
? ? image: 172.100.0.22/library/nginx:latest
? ? ports:
? ? - name: http
? ? ? containerPort: 80
? ? lifecycle:
? ? ? postStart:
? ? ? ? exec:
? ? ? ? ? command: ["/bin/sh", "-c", "echo Heslty > /usr/share/nginx/html/healthz"]
? ? livenessProbe:
? ? ? httpGet:
? ? ? ? path: /healthz
? ? ? ? port: http
? ? ? initialDelaySeconds: 30
? ? ? periodSeconds: 3
4.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件創(chuàng)建 Pod龙巨,具體要求如下:
(1)Pod 名稱:pod-volume笼呆;
(2)鏡像:nginx;
(3)Volume 名稱為 cache-volume旨别,將其/data 目錄掛載到宿主機(jī)/data 目錄下诗赌。
[root@k8s-master-node1 ~]# vim pod-volume.yaml # pod調(diào)度到哪個(gè)節(jié)點(diǎn)掛載的就是哪個(gè)節(jié)點(diǎn)的目錄
apiVersion: v1
kind: Pod
metadata:
? name: pod-volume
spec:
? containers:
? - name: con
? ? image: 172.100.0.22/library/nginx:latest
? ? volumeMounts:
? ? - name: cache-volume
? ? ? mountPath: /data
? volumes:
? - name: cache-volume
? ? hostPath:
? ? ? path: /data
[root@master ~]# kubectl exec -it pod-volume -- /bin/bash
5.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 pod.yaml 創(chuàng)建 Pod,具體要求如下:
(1)Pod 名稱:nginx秸弛;
(2)鏡像:nginx:latest铭若;
(3)要求該 Pod 以 Guaranteed QoS 類運(yùn)行,其 requests 值等于 limits 值递览。
[root@k8s-master-node1 ~]# vim pod-qos.yaml
apiVersion: v1
kind: Pod
metadata:
? name: pod-qos
spec:
? containers:
? - name: con
? ? image: 172.100.0.22/library/nginx:latest
? ? resources:
? ? ? limits:
? ? ? ? cpu: 700m
? ? ? ? memory: 200Mi
? ? ? requests:
? ? ? ? cpu: 700m
? ? ? ? memory: 200Mi
6.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 pod-host.yaml 創(chuàng)建 Pod叼屠,具體要求如下:
(1)Pod 名稱:hostaliases-pod;
(2)為該 Pod 配置 HostAliases绞铃,向 hosts 文件添加額外的條目镜雨,將 foo.local、bar.local解析為 127.0.0.1儿捧,將 foo.remote冷离、bar.remote 解析為 10.1.2.3。
[root@k8s-master-node1 ~]# vim pod-host.yaml
apiVersion: v1
kind: Pod
metadata:
? name: hostaliases-pod
spec:
? containers:
? - name: con
? ? image: 172.100.0.22/library/busybox:latest
? ? command: ["/bin/sh", "-c", "cat /etc/hosts"]
? hostAliases:
? - ip: '127.0.0.1'
? ? hostnames:
? ? - 'fool.local'
? ? - 'bar.local'
? - ip: '10.1.2.3'
? ? hostnames:
? ? - 'fool.remote'
? ? - 'bar.remote'
? restartPolicy: Never
7.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 nginx.yaml 創(chuàng)建 Pod纯命,具體要求如下:
(1)Pod 名稱:nginx-pod;
(2)鏡像:nginx痹栖;
(3)鏡像拉取策略:IfNotPresent亿汞;
(4)啟用進(jìn)程命名空間共享。
[root@k8s-master-node1 ~]# vim pod-NameSpaceShare.yaml
apiVersion: v1
kind: Pod
metadata:
? name: nginx-pod
spec:
? containers:
? - name: nginx
? ? image: 172.100.0.22/library/nginx:latest
? - name: shell
? ? image: 172.100.0.22/library/busybox:latest
? ? securityContext:
? ? ? capabilities:
? ? ? ? add:
? ? ? ? - SYS_PTRACE
? ? stdin: true # 相當(dāng)于i揪阿,交互
? ? tty: true # 相當(dāng)于t疗我,終端
? shareProcessNamespace: true
[root@master ~]# kubectl attach -it nginx -c shell
/ # ps ax
/ # kill -HUP 7
/ # ps ax
/ # head /proc/7/root/etc/nginx/nginx.conf
8.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 pod-redis-nginx.yaml 創(chuàng)建 Pod咆畏,具體要求如下:
(1)命名空間:default;
(2)Pod 名稱:pod-redis-nginx吴裤;
(3)該 Pod 包含 2 個(gè)容器:redis 和 nginx旧找,分別使用鏡像 redis 和 nginx。
[root@k8s-master-node1 ~]# vim pod-redis-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
? name: pod-redis-nginx
? namespace: default
spec:
? containers:
? - name: redis
? ? image: 172.100.0.22/library/redis:latest
? ? ports:
? ? - containerPort: 6379
? - name: nginx
? ? image: 172.100.0.22/library/nginx:latest
? ? ports:
? ? - containerPort: 80
CronJob
1.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 cronjob.yaml 創(chuàng)建的 CronJob麦牺,具體要求如下:
(1)Cronjob 名稱:cronjob钮蛛;
(2)鏡像:busybox;
(3)要求該 CronJob 的.spec 配置文件每分鐘打印出當(dāng)前時(shí)間信息剖膳。
[root@k8s-master-node1 ~]# vim cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
? name: cronjob
spec:
? schedule: "*/1 * * * *"
? jobTemplate:
? ? spec:
? ? ? template:
? ? ? ? spec:
? ? ? ? ? containers:
? ? ? ? ? - name: hello
? ? ? ? ? ? image: 172.100.0.22/library/busybox:latest
? ? ? ? ? ? command: ["/bin/sh", "-c", "date"]
? ? ? ? ? restartPolicy: OnFailure
ReplicaSet
1. 在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 replicaset.yaml 創(chuàng)建 ReplicaSet魏颓。具體要求如下:
(1)ReplicaSet 名稱:nginx;
(2)命名空間:default吱晒;
(3)副本數(shù):3甸饱;
(4)鏡像:nginx。
[root@k8s-master-node1 ~]# vim replicaSet.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
? name: nginx
? namespace: default
spec:
? replicas: 3
? selector:
? ? matchLabels:
? ? ? app: myapp
? template:
? ? metadata:
? ? ? name: app
? ? ? labels:
? ? ? ? app: myapp
? ? spec:
? ? ? containers:
? ? ? - name: myapp
? ? ? ? image: 172.100.0.22/library/nginx:latest
? ? ? ? ports:
? ? ? ? - containerPort: 80
DaemonSet
1.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 daemonset.yaml 創(chuàng)建 DaemonSet仑濒,具體要求如下:
(1)DaemonSet 名稱:nginx叹话;
(2)鏡像:nginx:latest;
(3)確保其在集群的每個(gè)節(jié)點(diǎn)上運(yùn)行一個(gè) Pod墩瞳,且不覆蓋當(dāng)前環(huán)境中的任何 traints驼壶。
[root@k8s-master-node1 ~]# vim daemonSet.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
? name: nginx
spec:
? selector:
? ? matchLabels:
? ? ? app: nginx
? template:
? ? metadata:
? ? ? name: pod
? ? ? labels:
? ? ? ? app: nginx
? ? spec:
? ? ? containers:
? ? ? - name: con
? ? ? ? image: 172.100.0.22/library/nginx:latest
? ? ? tolerations:
? ? ? - operator: "Exists"
Deployment
1.為 master 節(jié)點(diǎn)打上標(biāo)簽“disktype=ssd”和標(biāo)簽“exam=chinaskill”,然后在 master節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 deployment.yaml 創(chuàng)建 Deployment矗烛,具體要求如下:
(1)Deployment 名稱:nginx-deployment辅柴;
(2)要求 Pod 只能調(diào)度到具有標(biāo)簽“disktype=ssd”的節(jié)點(diǎn)上;
(3)具有標(biāo)簽“exam=chinaskill”的節(jié)點(diǎn)優(yōu)先被調(diào)度瞭吃。
[root@k8s-master-node1 ~]# kubectl label nodes k8s-master-node1 disktype=ssd
[root@k8s-master-node1 ~]# kubectl label nodes k8s-master-node1 exam=chinaskill
[root@k8s-master-node1 ~]# kubectl label nodes k8s-master-node1 exam-
[root@k8s-master-node1 ~]# kubectl get nodes --show-labels
[root@k8s-master-node1 ~]# vim deployment-affinity.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
? name: nginx-deployment
spec:
? selector:
? ? matchLabels:
? ? ? app: nginx
? template:
? ? metadata:
? ? ? labels:
? ? ? ? app: nginx
? ? spec:
? ? ? containers:
? ? ? - name: nginx
? ? ? ? image: 172.100.0.22/library/nginx:latest
? ? ? ? ports:
? ? ? ? - containerPort: 80
? ? ? nodeSelector:
? ? ? ? disktype: ssd
? ? ? affinity:
? ? ? ? nodeAffinity:
? ? ? ? ? preferredDuringSchedulingIgnoredDuringExecution:
? ? ? ? ? - weight: 1
? ? ? ? ? ? preference:
? ? ? ? ? ? ? matchExpressions:
? ? ? ? ? ? ? - key: exam
? ? ? ? ? ? ? ? operator: In
? ? ? ? ? ? ? ? values:
? ? ? ? ? ? ? ? - chinaskill
2.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 nginx-deployment.yaml 創(chuàng)建 Deployment碌嘀,具體要求如下:
(1)Deployment 名稱:nginx;
(2)保證其副本在每個(gè)節(jié)點(diǎn)上運(yùn)行歪架,且不覆蓋節(jié)點(diǎn)原有的 Tolerations股冗。
完成后使用該 YAML 文件創(chuàng)建 Deployment。
[root@k8s-master-node1 ~]# vim deployment-tolerations.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
? name: nginx
spec:
? selector:
? ? matchLabels:
? ? ? app: nginx
? template:
? ? metadata:
? ? ? name: myapp
? ? ? labels:
? ? ? ? app: nginx
? ? spec:
? ? ? containers:
? ? ? - name: con
? ? ? ? image: 172.100.0.22/library/nginx:latest
? ? ? ? ports:
? ? ? ? - containerPort: 80
3.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 deployment.yaml 創(chuàng)建 Deployment和蚪,具體要求如下:
(1)Deployment 名稱:nginx-app止状;
(2)包含 3 個(gè)副本;
(3)鏡像使用 nginx:1.15.4
完成后使用該 YAML 文件創(chuàng)建 Deployment攒霹。然后通過滾動(dòng)升級(jí)的方式更新鏡像版本為1.16.0怯疤,并記錄這個(gè)更新,最后催束,回滾該更新到之前的 1.15.4? 版本集峦。
[root@k8s-master-node1 ~]# vim deployment-rollout.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
? name: nginx-app
spec:
? replicas: 3
? selector:
? ? matchLabels:
? ? ? app: myapp
? template:
? ? metadata:
? ? ? name: pod
? ? ? labels:
? ? ? ? app: myapp
? ? spec:
? ? ? containers:
? ? ? - name: container
? ? ? ? image: 172.100.0.22/library/nginx:1.15.4
? ? ? ? ports:
? ? ? ? - containerPort: 80
[root@k8s-master-node1 ~]# kubectl apply -f deployment-rollout.yaml --record
[root@k8s-master-node1 ~]# kubectl rollout history deployment nginx-app
[root@k8s-master-node1 ~]# kubectl set image deployment/nginx-app container=172.100.0.22/library/nginx:1.16.0
[root@k8s-master-node1 ~]# kubectl set image deployment/nginx-app container=172.100.0.22/library/nginx:latest
[root@k8s-master-node1 ~]# kubectl rollout status deployment/nginx-app
[root@k8s-master-node1 ~]# kubectl rollout undo deployment/nginx-app
[root@k8s-master-node1 ~]# kubectl rollout undo deployment/nginx-app --to-revision=1
4.在 master 節(jié)點(diǎn)創(chuàng)建 Deployment,具體要求如下:
(1)Deployment 名稱:exam2022;
(2)鏡像:redis:latest:
(3)副本數(shù):7塔淤;
(4)label:app_enb_stage=dev摘昌。
[root@k8s-master-node1 ~]# vim deployment-redis.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
? name: exam2022
? labels:
? ? app_enb_stage: dev
spec:
? selector:
? ? matchLabels:
? ? ? app_enb_stage: dev
? replicas: 7
? template:
? ? metadata:
? ? ? labels:
? ? ? ? app_enb_stage: dev
? ? spec:
? ? ? containers:
? ? ? - name: redis
? ? ? ? image: 172.100.0.22/library/redis:latest
? ? ? ? ports:
? ? ? ? - containerPort: 6379
5. 在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 deployment-nginx.yaml 創(chuàng)建 Deployment,具體要求如下:
(1)Deployment 名稱:nginx-deployment高蜂;
(2)鏡像:nginx聪黎;
(3)副本數(shù):2;
(4)網(wǎng)絡(luò):hostNetwork备恤;
(5)容器端口:80稿饰。
[root@k8s-master-node1 ~]# vim deployment-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
? name:? nginx-deployment
? labels:
? ? app: nginx
spec:
? replicas: 2
? selector:
? ? matchLabels:
? ? ? app: nginx
? template:
? ? metadata:
? ? ? name: nginx-pod
? ? ? labels:
? ? ? ? app: nginx
? ? spec:
? ? ? hostNetwork: true
? ? ? containers:
? ? ? - name: nginx-con
? ? ? ? image: 172.100.0.22/library/nginx:latest
? ? ? ? ports:
? ? ? ? - containerPort: 80
Service
[root@k8s-master-node1 ~]# vim deployment-server.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
? name: nginx-app
spec:
? replicas: 3
? selector:
? ? matchLabels:
? ? ? app: nginx
? template:
? ? metadata:
? ? ? name: pod
? ? ? labels:
? ? ? ? app: nginx
? ? spec:
? ? ? containers:
? ? ? - name: container
? ? ? ? image: 172.100.0.22/library/nginx:latest
? ? ? ? ports:
? ? ? ? - name: http
? ? ? ? ? containerPort: 80? ? ? ? ?
1. 在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 service-cluster.yaml 創(chuàng)建 Service,具體要求如下:
(1)Service 名稱:exam-service烘跺;
(2)集群內(nèi)部訪問端口:80湘纵;targetPort: 81;
(3)使用 TCP 協(xié)議滤淳;
(4)服務(wù)類型:ClusterIP
[root@k8s-master-node1 ~]# vim service-ClusterIP.yaml
apiVersion: v1
kind: Service
metadata:
? name: service-clusterip
? namespace: default
spec:
? type: ClusterIP
? selector:
? ? app: nginx
? ports:
? - name: http
? ? protocol: TCP
? ? port: 80
? ? targetPort: 81
# targetPort設(shè)置為80才可以使用service
2.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 service-nodeport.yaml梧喷,具體要求如下:
(1)Service 名稱:nginx-service;
(2)關(guān)聯(lián)名為 nginx 的 Deployment脖咐;
(3)以 NodePort 方式將其 80 端口對(duì)外暴露為 30080铺敌。
[root@k8s-master-node1 ~]# vim service-NodePort.yaml
apiVersion: v1
kind: Service
metadata:
? name: service-nodeport
? namespace: default
spec:
? type: NodePort
? selector:
? ? app: nginx
? ports:
? - name: http
? ? port: 80
? ? nodePort: 30001
ConfigMap
1.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件創(chuàng)建 Pod 并使用 ConfigMap,具體要求如下:
(1)Pod 名稱:exam屁擅;
(2)鏡像:busybox偿凭;
(3)使 用 ConfigMap , 并 設(shè) 置 變 量 “ DB_HOST=localhost ” 和“DB_PORT=3306”派歌。
[root@k8s-master-node1 ~]# vim configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
? name: mycm
data:
? host: 'localhost'
? port: '3306'
---
apiVersion: v1
kind: Pod
metadata:
? name: exam
spec:
? containers:
? - name: con
? ? image: 172.100.0.22/library/busybox:latest
? ? command: ["/bin/sh", "-c", "sleep 3600"]
? ? env:
? ? - name: DB_HOST
? ? ? valueFrom:
? ? ? ? configMapKeyRef:
? ? ? ? ? name: mycm
? ? ? ? ? key: host
? ? - name: DB_PORT
? ? ? valueFrom:
? ? ? ? configMapKeyRef:
? ? ? ? ? name: mycm
? ? ? ? ? key: port
? ? envFrom:
? ? - configMapRef:
? ? ? ? name: mycm
? restartPolicy: Never
2.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件創(chuàng)建 Pod 并使用 ConfigMap弯囊,具體要求如下:
(1)Pod 名稱:exam;
(2)鏡像:busybox胶果;
(3)在 數(shù) 據(jù) 卷 里 面 使 用 ConfigMap 匾嘱, 并 設(shè) 置 變 量 “ DB_HOST=localhost ” 和“DB_PORT=3306”。
[root@k8s-master-node1 ~]# vim configmap-volume.yaml
apiVersion: v1
kind: ConfigMap
metadata:
? name: mycm
data:
? host: 'localhost'
? port: '3306'
---
apiVersion: v1
kind: Pod
metadata:
? name: exam
spec:
? containers:
? - name: con
? ? image: 172.100.0.22/library/busybox:latest
? ? command: ["/bin/sh", "-c", "sleep 3600"]
? ? volumeMounts:
? ? - name: config-volume
? ? ? mountPath: /etc/config
? volumes:
? ? - name: config-volume
? ? ? configMap:
? ? ? ? name: mycm
? restartPolicy: Never
? Secret
1.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 secret.yaml 創(chuàng)建 Secret 和 Pod早抠,具體要求如下:
(1)Secret 名稱:mysecret霎烙;
(2)包含一個(gè) password 字段(手動(dòng) base64 加密);
(3)第一個(gè) Pod test1 使用 env 引用 mysecret蕊连;
(4)第二個(gè) Pod test2 使用 volume 引用 mysecret悬垃。
[root@k8s-master-node1 ~]# echo -n admin | base64 # YWRtaW4=
[root@k8s-master-node1 ~]# echo -n password | base64 # cGFzc3dvcmQ=
[root@k8s-master-node1 ~]# echo -n YWRtaW4= | base64 -d # admin
[root@k8s-master-node1 ~]# echo -n cGFzc3dvcmQ= | base64 -d # password
[root@k8s-master-node1 ~]# vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
? name: mysecret
? namespace: default
type: Opaque
data:
? password: MWYyZDFlMmU2N2Rm
? username: YWRtaW4=
stringData:
? name: admin # secret自動(dòng)編碼,pod使用時(shí)自動(dòng)解碼
---
apiVersion: v1
kind: Pod
metadata:
? name: test1
spec:
? containers:
? - name: con
? ? image: 172.100.0.22/library/nginx:latest
? ? volumeMounts:
? ? - name: secrets
? ? ? mountPath: /etc/secrets
? ? ? readOnly: true
? volumes:
? - name: secrets
? ? secret:
? ? ? secretName: mysecret
---
apiVersion: v1
kind: Pod
metadata:
? name: test2
spec:
? containers:
? - name: con
? ? image: 172.100.0.22/library/nginx:latest
? ? env:
? ? - name: passwd
? ? ? valueFrom:
? ? ? ? secretKeyRef:
? ? ? ? ? name: mysecret
? ? ? ? ? key: password
? ? - name: name
? ? ? valueFrom:
? ? ? ? secretKeyRef:
? ? ? ? ? name: mysecret
? ? ? ? ? key: name
[root@k8s-master-node1 ~]# kubectl exec -it test1 -- cat /etc/secrets/name # admin
[root@k8s-master-node1 ~]# kubectl exec -it test1 -- cat /etc/secrets/password # password
[root@k8s-master-node1 ~]# kubectl exec -it test2 -- /bin/sh
# echo $password
password
# echo $name
admin
PV
1.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 pv.yaml 創(chuàng)建 PV甘苍,具體要求如下:
(1)PV 名稱:app-pv尝蠕;
(2)容量為 10Gi;
(3)訪問模式為 ReadWriteMany载庭;
(4)volume 的類型為 hostPath看彼,位置為/src/app-config扇谣。
[root@k8s-master-node1 ~]# vim pv-hostpath.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
? name: app-pv
spec:
? capacity:
? ? storage: 5Gi
? accessModes:
? ? - ReadWriteMany
? hostPath:
? ? path: /src/app-config
2.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 pv.yaml 創(chuàng)建 PV,具體要求如下:
(1)PV 名稱:pv-local闲昭;
(2)回收策略:Delete;
(3)訪問模式:RWO靡挥;
(4)掛載路徑:node 節(jié)點(diǎn)/data/k8s/localpv序矩;
(5)卷容量:5G。
[root@k8s-master-node1 ~]# vim pv-local.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
? name: pv-local
spec:
? capacity:
? ? storage: 5Gi
? storageClassName: slow
? persistentVolumeReclaimPolicy: Delete
? accessModes:
? ? - ReadWriteOnce
? local:
? ? path: /data/k8s/localpv
? nodeAffinity:
? ? required:
? ? ? nodeSelectorTerms:
? ? ? - matchExpressions:
? ? ? ? - key: kubernetes.io/hostname
? ? ? ? ? operator: In
? ? ? ? ? values:
? ? ? ? ? - hostname=k8s-worker-node1
LimitRange
1.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 limitrange.yaml 創(chuàng)建命名空間跋破,具體要求如下:
(1)命名空間名稱: resource 簸淀;
(2)容器資源請(qǐng)求上限為 800Mi 內(nèi)存、3000m CPU毒返;
(3)容器資源請(qǐng)求下限為 100Mi 內(nèi)存租幕,300m CPU;
(4)容器默認(rèn)資源請(qǐng)求為 256Mi 內(nèi)存拧簸、500m CPU劲绪;
(5)內(nèi)存和 CPU 超售的比率均為
[root@k8s-master-node1 ~]# vim limitrange.yaml
apiVersion: v1
kind: Namespace
metadata:
? name: resource
---
apiVersion: v1
kind: LimitRange
metadata:
? name: limitrange-pode
? namespace: resource
spec:
? limits:
? - type: Pod
? ? max:
? ? ? cpu: 4
? ? ? memory: 8Gi
? ? min:
? ? ? cpu: 250m
? ? ? memory: 100Mi
? ? maxLimitRequestRatio:
? ? ? cpu: 2
? ? ? memory: 2
---
apiVersion: v1
kind: LimitRange
metadata:
? name: limitrange-con
? namespace: resource
spec:
? limits:
? - type: Container
? ? default:
? ? ? cpu: 1
? ? ? memory: 2Gi
? ? defaultRequest:
? ? ? cpu: 500m
? ? ? memory: 1Gi
? ? max:
? ? ? cpu: 2
? ? ? memory: 4Gi
? ? min:
? ? ? cpu: 300m
? ? ? memory: 512Mi
? ? maxLimitRequestRatio:
? ? ? cpu: 2
? ? ? memory: 2
默認(rèn)和請(qǐng)求上限以? ? 為準(zhǔn)
defaultrequest和defaultlimit則是默認(rèn)值,注意:pod級(jí)別沒有這兩項(xiàng)設(shè)置
如果container設(shè)置了max盆赤, pod中的容器必須設(shè)置limit贾富,如果未設(shè)置,則使用defaultlimt的值牺六,如果defaultlimit也沒有設(shè)置颤枪,則無法成功創(chuàng)建
如果設(shè)置了container的min,創(chuàng)建容器的時(shí)候必須設(shè)置request的值淑际,如果沒有設(shè)置畏纲,則使用defaultrequest,如果沒有defaultrequest春缕,則默認(rèn)等于容器的limit值盗胀,如果limit也沒有,啟動(dòng)就會(huì)報(bào)錯(cuò)
ResourceQuota:
1.創(chuàng)建命名空間 quota-example淡溯,在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 quota.yaml創(chuàng)建 ResourceQuota读整,具體要求如下:
(1)ResourceQuota 名稱:compute-resources;
(2)命名空間resource內(nèi)所有 Pod 數(shù)量不超過 4咱娶;
(4)命名空間resource內(nèi)所有容器內(nèi)存申請(qǐng)總和不得超過 1G米间;
(5)命名空間resource內(nèi)所有容器內(nèi)存限制不得超過 2G;
(6)命名空間resource內(nèi)所有容器申請(qǐng)的 CPU 不得超過 1膘侮;
(7)命名空間resource內(nèi)所有容器限制的 CPU 不得超過 2屈糊。
(8)限制命名空間resource的 PVC 數(shù)目為 10;
(9)限制命名空間resource累計(jì)存儲(chǔ)容量為 20Gi琼了。
[root@k8s-master-node1 ~]# vim quota.yaml
apiVersion: v1
kind: Namespace
metadata:
? name: resource
---
apiVersion: v1
kind: ResourceQuota
metadata:
? name: compute-resources
? namespace: resource
spec:
? hard:
? ? pods: 4
? ? requests.cpu: 1
? ? requests.memory: 1Gi
? ? limits.cpu: 2
? ? limits.memory: 2Gi
? ? persistentvolumeclaims: 10
HPA
1.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 hpa.yaml 為上一題的 Deployment 創(chuàng)建 Pod水平自動(dòng)伸縮逻锐,具體要求如下:
(1)Pod 水平自動(dòng)伸縮名稱:frontend-scaler夫晌;
(2)副本數(shù)伸縮范圍:3--5;
(3)期望每個(gè) Pod 根據(jù)設(shè)定的 CPU 使用率 50%動(dòng)態(tài)的伸縮昧诱。
[root@k8s-master-node1 ~]# vim hpa.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
? name: frontend-scaler
spec:
? maxReplicas: 5
? minReplicas: 3
? scaleTargetRef:
? ? apiVersion: v1
? ? kind: Deployment
? ? name: deployment-redis
? targetCPUUtilizationPercentage: 50
#? metrics:
#? ? - type: Resource
#? ? ? resource:
#? ? ? ? name: memory
#? ? ? ? targetAverageUtilization: 50
Role與ClusterRole
1. 在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 role.yaml 文件創(chuàng)建集群角色晓淀,具體要求如下:
(1)角色名稱:deployment-role;
(2)該角色擁有對(duì) Deployment盏档、Daemonset凶掰、StatefulSet 的創(chuàng)建權(quán)限。
[root@k8s-master-node1 ~]#? vim role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind:? Role
metadata:
? name: deployment-role
rules:
- apiGroups: [""]
? resources: ["delopyments", "daemonsets", "statefulsets"]
? verbs: ["create"]
apiGroups可配置參數(shù)
“”,“apps”, “autoscaling”, “batch”
resources可配置參數(shù)
services蜈亩、endpoints懦窘、pods、secrets稚配、configmaps畅涂、crontabs、deployments道川、jobs午衰、nodes、rolebindings愤惰、clusterroles苇经、daemonsets、replicasets宦言、statefulsets扇单、horizontalpodautoscalers、replicationcontrollers奠旺、cronjobs
verbs可配置參數(shù)
get蜘澜、list、watch响疚、create鄙信、update位谋、patch为朋、delete钞它、exec
2. 在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 clusterrole.yaml 創(chuàng)建集群角色煤痕,具體要求如下:
(1)集群角色名稱:exam-reader;
(2)對(duì) default 命名空間內(nèi)的 Pod 擁有 get他去、watch荸百、list稽坤、create咕幻、delete 的權(quán)限渔伯;
(3)對(duì) default 命名空間內(nèi)的 Deployment 擁有 get、list 的權(quán)限肄程。
[root@k8s-master-node1 ~]# vim clusterrole.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind:? ClusterRole
metadata:
? name: exam-reader
? namespace: default
rules:
- apiGroups: [""]
? resources: ["pods"]
? verbs: ["get, watch, list, create, delete"]
- apiGroups: [""]
? resources: ["deployments"]
? verbs: ["get, list"]
3. 在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件創(chuàng)建 ServiceAccount锣吼,具體要求如下:
(1)ServiceAccount 名稱:exam-sa选浑;
(2)將該 ServiceAccount 與上一題創(chuàng)建的 ClusterRole 進(jìn)行綁定綁定。
[root@k8s-master-node1 ~]# vim sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
? name: exam-sa
---
apiVersion: rbac.authorization.k8s.io/v1
kind:? ClusterRoleBinding
metadata:
? name: clusterrole-bind-sa
subjects:
- kind: ServiceAccount
? namespace: defaulet
? name: exam-sa
roleRef:
? kind: ClusterRole
? name: exam-reader
? apiGroup: ""
PriorityClass
1.Kubernetes 集群支持 Pod 優(yōu)先級(jí)搶占玄叠,通過搶占式調(diào)度策略來實(shí)現(xiàn)同一個(gè) Node 節(jié)點(diǎn)內(nèi)部的 Pod 對(duì)象搶占古徒。在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 schedule.yaml 創(chuàng)建一個(gè)搶占式調(diào)度策略,具體要求如下:
(1)搶占式調(diào)度策略名稱:high-scheduling读恃;
(2)優(yōu)先級(jí)為 1000000描函;
(3)不要將該調(diào)度策略設(shè)置為默認(rèn)優(yōu)先調(diào)度策略。
[root@k8s-master-node1 ~]# vim priorityClass.yaml
apiVersion: scheduling.k8s.io/v1
kind:? PriorityClass
metadata:
? name: high-scheduling
value: 1000000
globalDefault: false
PodSecurityPolicy
1.在 master 節(jié)點(diǎn)/root 目錄下編寫 yaml 文件 policy.yaml狐粱,具體要求如下:
(1)安全策略名稱:pod-policy;
(2)僅禁止創(chuàng)建特權(quán)模式的 Pod胆数;
(3)其它所有字段都被允許肌蜻。
[root@k8s-master-node1 ~]# vim podsecuritypolicy.yaml
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
? name: pod-policy
spec:
? privileged: false
? seLinux:
? ? rule: RunAsAny
? supplementalGroups:
? ? rule: RunAsAny
? runAsUser:
? ? rule: RunAsAny
? fsGroup:
? ? rule: RunAsAny
? volumes:
? - '*'
NetworkPolicy
1.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件創(chuàng)建 network.yaml 創(chuàng)建網(wǎng)絡(luò)策略,具體要求如下:
(1)網(wǎng)絡(luò)策略名稱:exam-nework必尼;
(2)針對(duì) namespace test 下的 Pod蒋搜,只允許相同 namespace 下的 Pod 訪問,并且可訪問Pod 的 9000 端口判莉。
[root@k8s-master-node1 ~]# vim network-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
? name: test
? labels:
? ? name: test
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
? name: exam-nework
? namespace: test
spec:
? podSelector: {}
? policyTypes:
? - Ingress
? ingress:
? - from:
? ? - namespaceSelector:
? ? ? ? matchLabels:
? ? ? ? ? project: test
? ? ports:
? ? - protocol: TCP
? ? ? port: 9000
2. 在 master 節(jié)點(diǎn)/root 目錄下編寫 yaml 文件 network-deny.yaml豆挽,具體要求如下:
(1)NetworkPolicy 名稱:default-deny;
(2)命名空間:default券盅;
(3)默認(rèn)禁止所有入 Pod 流量帮哈。
[root@k8s-master-node1 ~]# vim network-deny.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
? name: default-deny
? namespace: default
spec:
? podSelector: {}
? policyTypes:
? - Ingress
? - Egress
[root@k8s-master-node1 ~]# kubectl create deployment nginx --image=172.100.0.22/library/nginx:latest
[root@k8s-master-node1 ~]# kubectl expose deployment nginx --port=80
[root@k8s-master-node1 ~]# kubectl run busybox --rm -it --image=172.100.0.22/library/nginx:latest
/ # wget --spider --timeout=1 nginx
NFS
1.在 master 和 node 節(jié)點(diǎn)安裝 NFS 文件服務(wù)器,共享目錄為/data/k8s/锰镀,然后在 master節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 nfs-pv.yaml 創(chuàng)建 PV娘侍,具體要求如下:
(1)PV 名稱:exma-pv;
(2)使用 NFS 存儲(chǔ)作為后端存儲(chǔ)泳炉;
(3)存儲(chǔ)空間為 1Gi憾筏;
(4)訪問模式為 ReadWriteOnce;
(5)回收策略為 Recyle花鹅。
k8s-master-node1節(jié)點(diǎn)
[root@k8s-master-node1 ~]# yum install -y nfs-utils rpcbind
[root@k8s-master-node1 ~]# mkdir /data/k8s/
[root@k8s-master-node1 ~]# chmod 755 /data/k8s
[root@k8s-master-node1 ~]# vim /etc/exports
/data/k8s? *(rw,sync,no_root_squash)
[root@master ~]# systemctl restart nfs && systemctl restart rpcbind
[root@master ~]# systemctl enable nfs && systemctl enable rpcbind
k8s-worker-node1節(jié)點(diǎn)
[root@k8s-worker-node1 ~]# yum install -y nfs-utils rpcbind
[root@k8s-worker-node1 ~]# mkdir /data/k8s/
[root@k8s-worker-node1 ~]# chmod 755 /data/k8s
[root@k8s-worker-node1 ~]# mount -t nfs k8s-master-node1:/data/k8s/ /data/k8s/
[root@k8s-master-node1 ~]# vim nfs-pv.yaml
apiVersion:? v1
kind: PersistentVolume
metadata:
? name: exma-pv
spec:
? capacity:
? ? storage: 1Gi
? accessModes:
? ? - ReadWriteOnce
? persistentVolumeReclaimPolicy: Recycle
? nfs:
? ? path: /data/k8s
? ? server: 172.100.0.22
[root@k8s-master-node1 ~]# vim nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
? name: nfs-pvc
spec:
? accessModes:
? ? - ReadWriteOnce
? resources:
? ? requests:
? ? ? storage: 1Gi
Mysql
1.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件部署 MySQL 服務(wù)氧腰,具體要求如下:
(1)Service 名稱:myqsl;Deployment 名稱:myqsl刨肃;
(2)鏡像:mysql:5.7古拴;
(3)數(shù)據(jù)庫用戶:root;密碼:123456之景;
(4)掛載一個(gè)持久卷 mysql-pv斤富,擁有 2GB 的存儲(chǔ)空間,路徑為/ mnt/data锻狗;
(5)以 NodePort 方式將 3306 端口對(duì)外暴露為 33306.(端口范圍)
[root@k8s-master-node1 ~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
- --service-node-port-range=20000-65535
[root@k8s-master-node1 ~]# kubectl describe pod $apiserver_pods -n kube-system |grep service
[root@k8s-master-node1 ~]# vim mysql.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
? name: mysql-pv
? labels:
? ? type: local
spec:
? storageClassName: manual
? capacity:
? ? storage: 1Gi
? accessModes:
? ? - ReadWriteOnce
? hostPath:
? ? path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
? name: mysql-pvc
spec:
? storageClassName: manual
? accessModes:
? ? - ReadWriteOnce
? resources:
? ? requests:
? ? ? storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
? name: mysql
spec:
? selector:
? ? app: mysql
? ports:
? - port: 3306
? ? nodePort: 33306
? type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
? name: mysql
spec:
? selector:
? ? matchLabels:
? ? ? app: mysql
? template:
? ? metadata:
? ? ? labels:
? ? ? ? app: mysql
? ? spec:
? ? ? containers:
? ? ? - name: mysql
? ? ? ? image: 172.100.0.22/library/mysql:latest
? ? ? ? env:
? ? ? ? - name: MYSQL_ROOT_PASSWORD
? ? ? ? ? value: "123456"
? ? ? ? ports:
? ? ? ? - name: mysql
? ? ? ? ? containerPort: 3306
? ? ? ? volumeMounts:
? ? ? ? - name: mysql-volume
? ? ? ? ? mountPath: /var/lib/mysql
? ? ? volumes:
? ? ? - name: mysql-volume
? ? ? ? persistentVolumeClaim:
? ? ? ? ? claimName: mysql-pvc
Istio
BookInfo部署
k8s-worker-node1節(jié)點(diǎn)
[root@k8s-worker-node1 ~]# curl -O? 172.100.0.11:/1-package/ServiceMesh.tar.gz
[root@k8s-worker-node1 ~]# tar -xf ServiceMesh.tar.gz && docker load -i ServiceMesh/images/image.tar
[root@k8s-worker-node1 ~]# docker load -i ServiceMesh/images/image.tar
k8s-master-node1節(jié)點(diǎn)
[root@k8s-master-node1 ~]# curl -O? 172.100.0.11:/1-package/ServiceMesh.tar.gz
[root@k8s-master-node1 ~]# tar -xf ServiceMesh.tar.gz
[root@k8s-master-node1 ~]# docker load -i ServiceMesh/images/image.tar
[root@k8s-master-node1 ~]# kubectl apply -f ServiceMesh/bookinfo/
[root@k8s-master-node1 ~]# kubectl apply -f bookinfo-gateway.yaml
[root@k8s-master-node1 ~]# kubectl apply -f dr-all.yaml
[root@k8s-master-node1 ~]# kubectl label namespaces default istio-injection=enabled
[root@k8s-master-node1 ~]# vim bookinfo-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
? name: bookinfo-gateway
spec:
? selector:
? ? istio: ingressgateway
? servers:
? - port:
? ? ? number: 80
? ? ? name: http
? ? ? protocol: HTTP
? ? hosts:
? ? - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
? name: bookinfo
spec:
? hosts:
? - "*"
? gateways:
? - bookinfo-gateway
? http:
? - match:
? ? - uri:
? ? ? ? exact: /productpage
? ? - uri:
? ? ? ? prefix: /static
? ? - uri:
? ? ? ? exact: /login
? ? - uri:
? ? ? ? exact: /logout
? ? - uri:
? ? ? ? prefix: /api/v1/products
? ? route:
? ? - destination:
? ? ? ? host: productpage
? ? ? ? port:
? ? ? ? ? number: 9080
[root@k8s-master-node1 ~]# vim dr-all.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
? name: productpage
spec:
? host: productpage
? subsets:
? - name: v1
? ? labels:
? ? ? version: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
? name: reviews
spec:
? host: reviews
? subsets:
? - name: v1
? ? labels:
? ? ? version: v1
? - name: v2
? ? labels:
? ? ? version: v2
? - name: v3
? ? labels:
? ? ? version: v3
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
? name: ratings
spec:
? host: ratings
? subsets:
? - name: v1
? ? labels:
? ? ? version: v1
? - name: v2
? ? labels:
? ? ? version: v2
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
? name: details
spec:
? host: details
? subsets:
? - name: v1
? ? labels:
? ? ? version: v1
? - name: v2
? ? labels:
? ? ? version: v2
BookInfo運(yùn)維:
1.在 Kubernetes 集群中完成 Bookinfo 樣例程序的部署满力,在 master 節(jié)點(diǎn)/root目錄下編寫 YAML 文件 istio.yaml 創(chuàng)建請(qǐng)求路由焕参,具體要求如下:
(1)路由名稱:bookinfo-virtualservice;
(2)將所有流量路由到每個(gè)微服務(wù)的 v1 版本油额。
[root@k8s-master-node1 ~]# vim vs-all-v1.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
? name: productpage
spec:
? hosts:
? - productpage
? http:
? - route:
? ? - destination:
? ? ? ? host: productpage
? ? ? ? subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
? name: reviews
spec:
? hosts:
? - reviews
? http:
? - route:
? ? - destination:
? ? ? ? host: reviews
? ? ? ? subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
? name: ratings
spec:
? hosts:
? - ratings
? http:
? - route:
? ? - destination:
? ? ? ? host: ratings
? ? ? ? subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
? name: details
spec:
? hosts:
? - details
? http:
? - route:
? ? - destination:
? ? ? ? host: details
? ? ? ? subset: v1
2. 在 Kubernetes 集群中完成 Bookinfo 示例程序的部署叠纷,然后在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 istio.yaml 創(chuàng)建基于權(quán)重的路由,具體要求如下:
(1)虛擬服務(wù)名稱:reviews潦嘶;
(2)將 30%的流量路由到 reviews 服務(wù)的 v1 版本涩嚣;
(3)將 70%的流量路由到 reviews 服務(wù)的 v3 版本。
[root@k8s-master-node1 ~]# vim vs-30-70.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
? name: reviews
spec:
? hosts:
? ? - reviews
? http:
? - route:
? ? - destination:
? ? ? ? host: reviews
? ? ? ? subset: v1
? ? ? weight: 30
? ? - destination:
? ? ? ? host: reviews
? ? ? ? subset: v3
? ? ? weight: 70
3. 在 Kubernetes 集群中完成 Bookinfo 樣例程序的部署掂僵,然后在 maser 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 istio.yaml 配置 HTTP 請(qǐng)求超時(shí)航厚,具體要求如下:
(1)路由名稱:reviews;
(2)將請(qǐng)求路由到 reviews 服務(wù)的 v2 版本锰蓬;
(3)對(duì) reviews 服務(wù)的調(diào)用增加一個(gè)半秒的請(qǐng)求超時(shí)幔睬。
[root@k8s-master-node1 ~]# vim vs-timeout.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
? name: reviews
spec:
? hosts:
? - reviews
? http:
? - route:
? ? - destination:
? ? ? ? host: reviews
? ? ? ? subset: v2
? ? timeout: 0.5s
4. 在 Kubernetes 集群中完成 Bookinfo 示例程序的部署,然后在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 istio.yaml 為 ratings 服務(wù)注入 HTTP 延遲故障芹扭,具體要求如下:
(1)注入規(guī)則名稱:ratings麻顶;
(2)為用戶 jason 在 reviews:v2 和 ratings 服務(wù)之間注入一個(gè) 7 秒的延遲。
[root@k8s-master-node1 ~]# vim vs-delay.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
? name: ratings
spec:
? hosts:
? - ratings
? http:
? - fault:
? ? ? delay:
? ? ? ? percentage:
? ? ? ? ? value: 100.0
? ? ? ? fixedDelay: 7s
? ? match:
? ? - headers:
? ? ? ? end-user:
? ? ? ? ? exact: jason
? ? route:
? ? - destination:
? ? ? ? host: ratings
? ? ? ? subset: v1
? - route:
? ? - destination:
? ? ? ? host: ratings
? ? ? ? subset: v1
Httpbin運(yùn)維:
1.在 Kubernetes 集群中完成 httpbin 樣例程序的部署舱卡,然后在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 istio.yaml 創(chuàng)建默認(rèn)路由策略辅肾,具體要求如下:
(1)路由策略名稱:httpbin;
(2)將 100%流量路由到服務(wù)的 v1 版本轮锥;
(3)將 100%的相同流量鏡像到服務(wù)的 v2 版本矫钓。
[root@k8s-master-node1 ~]# kubectl apply -f httpbin-v1-v2.yaml
[root@k8s-master-node1 ~]# kubectl apply -f sleep.yaml
[root@k8s-master-node1 ~]# kubectl apply -f mirror.yaml
[root@k8s-master-node1 ~]# kubectl exec SLEEP_POD -c sleep -- curl -sS http://httpbin:8000/headers # 發(fā)送流量
[root@k8s-master-node1 ~]# kubectl logs HTTPBIN_V1_POD -c httpbin # 查看日志
[root@k8s-master-node1 ~]# kubectl logs HTTPBIN_V2_POD -c httpbin # 查看日志
[root@k8s-master-node1 ~]# vim istio/httpbin/mirror.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
? name: httpbin
spec:
? hosts:
? ? - httpbin
? http:
? - route:
? ? - destination:
? ? ? ? host: httpbin
? ? ? ? subset: v1
? ? ? weight: 100
? ? mirror:
? ? ? host: httpbin
? ? ? subset: v2
? ? mirrorPercent: 100
---
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
? name: httpbin
spec:
? host: httpbin
? subsets:
? - name: v1
? ? labels:
? ? ? version: v1
? - name: v2
? ? labels:
? ? ? version: v2
2.在 Kubernetes 集群中完成 httpbin 樣例程序的部署,然后在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 istio.yaml 配置熔斷器舍杜,具體要求如下:
(1)目標(biāo)規(guī)則名稱:httpbin份汗;
(2)將 TLS 流量策略 mode:ISTIO_MUTUAL 添加到目標(biāo)規(guī)則;
(3)要求當(dāng)并發(fā)的連接和請(qǐng)求數(shù)超過一個(gè)蝴簇,在 istio-proxy 進(jìn)行進(jìn)一步的請(qǐng)求和連接時(shí)杯活,后續(xù)請(qǐng)求或連接將被阻止。
(1)定義到目標(biāo)主機(jī)的 HTTP1/TCP 最大連接數(shù)為 1熬词;
(2)定義針對(duì)一個(gè)目標(biāo)的 HTTP 請(qǐng)求的最大排隊(duì)數(shù)量為 1旁钧;
(3)定義對(duì)某一后端的請(qǐng)求中,一個(gè)連接內(nèi)能夠發(fā)出的最大請(qǐng)求數(shù)量為 1互拾。
[root@k8s-master-node1 ~]# kubectl apply -f httpbin-cb.yaml
[root@k8s-master-node1 ~]# kubectl apply -f dr-cb.yaml
[root@k8s-master-node1 ~]# kubectl apply -f fortio-deploy.yaml
[root@k8s-master-node1 ~]# kubectl exec "$FORTIO_POD" -c fortio -- /usr/bin/fortio curl -quiet http://httpbin:8000/get # 一次請(qǐng)求
[root@k8s-master-node1 ~]# kubectl exec "$FORTIO_POD" -c fortio -- /usr/bin/fortio load -c 2 -qps 0 -n 20 -loglevel Warning http://httpbin:8000/get? # 發(fā)送并發(fā)數(shù)為 2 的連接(-c 2)歪今,請(qǐng)求 20 次(-n 20)
[root@k8s-master-node1 ~]# kubectl exec "$FORTIO_POD" -c istio-proxy -- pilot-agent request GET stats | grep httpbin | grep pending # 查看熔斷詳情
[root@k8s-master-node1 ~]# vim dr-rd.yaml
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
? name: httpbin
spec:
? host: httpbin
? trafficPolicy:
? ? connectionPool:
? ? ? tcp:
? ? ? ? maxConnections: 1
? ? ? http:
? ? ? ? http1MaxPendingRequests: 1
? ? ? ? http1MaxPendingRequests: 1
? ? outlierDetection:
? ? ? consecutive5xxErrors: 1
? ? ? interval: 1s
? ? ? baseEjectionTime: 3m
? ? ? maxEjectionPercent: 100
? ? tls:
? ? ? mode: ISTIO_MUTUAL
3.在 Kubernetes 集群中完成 HTTPBin 樣例程序的部署,然后在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 istio.yaml 創(chuàng)建 Ingress Gateway颜矿,具體要求如下:
(1)以 NodePort 方式配置 Ingress 端口寄猩;
(2)在 80 端口為 HTTP 流量配置一個(gè) Gateway,名稱:httpbin-gateway骑疆;
(3)為 Gateway 的入口流量配置路由田篇,允許流量流向路徑/status 和/delay替废;
(4)對(duì)外訪問的域名:httpbin.example.com。
[root@k8s-master-node1 ~]# kubectl apply -f httpbin-nodeport.yaml
[root@k8s-master-node1 ~]# kubectl apply -f ingress-gateway.yaml
[root@k8s-master-node1 ~]# curl -s -I -HHost:httpbin.example.com "http://192.168.100.30:31083/status/200"
[root@k8s-master-node1 ~]# curl -s -I -HHost:httpbin.example.com "http://192.168.100.30:31083/headers"
[root@k8s-master-node1 ~]# vim ingress-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
? name: httpbin-gateway
spec:
? selector:
? ? istio: ingressgateway
? servers:
? - port:
? ? ? number: 80
? ? ? name: http
? ? ? protocol: HTTP
? ? hosts:
? ? - "httpbin.example.com"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
? name: httpbin
spec:
? hosts:
? - "httpbin.example.com"
? gateways:
? - httpbin-gateway
? http:
? - match:
? ? - uri:
? ? ? ? prefix: /status
? ? - uri:
? ? ? ? prefix: /delay
? ? route:
? ? - destination:
? ? ? ? port:
? ? ? ? ? number: 8000
? ? ? ? host: httpbin
4. 在 Kubernetes 集群中完成 HTTPBin 服務(wù)的部署泊柬,在 master 節(jié)點(diǎn)/root 目錄下編寫YAML 文件 istio.yaml 創(chuàng)建 Egress 控制 Istio 服務(wù)網(wǎng)格的出口流量椎镣,具體要求如下:
(1)虛擬服務(wù)名稱:httpbin-ext;
(2)設(shè)置調(diào)用外部服務(wù) httpbin.org 的超時(shí)時(shí)間為 3 秒兽赁;
(3)響應(yīng)時(shí)間超過 3 秒的 httpbin.org 服務(wù)將被切斷状答。
[root@k8s-master-node1 ~]# kubectl apply -f sleep.yaml
[root@k8s-master-node1 ~]# kubectl exec -it SLEEP_POD -c sleep -- curl -I https://www.baidu.com | grep? "HTTP/" # 200
[root@k8s-master-node1 ~]# istioctl install --set profile=demo? --set meshConfig.outboundTrafficPolicy.mode=REGISTRY_ONLY?
[root@k8s-master-node1 ~]# kubectl exec -it SLEEP_POD -c sleep -- curl -I https://www.baidu.com | grep? "HTTP/"; # code35
[root@k8s-master-node1 ~]# kubectl apply -f se-http.yaml
[root@k8s-master-node1 ~]# kubectl exec SLEEP_POD? -c sleep -- time curl -o /dev/null -sS -w "%{http_code}\n" http://httpbin.org/delay/5 # 200
[root@k8s-master-node1 ~]# kubectl apply -f egress.yaml
[root@k8s-master-node1 ~]# kubectl exec SLEEP_POD? -c sleep -- time curl -o /dev/null -sS -w "%{http_code}\n" http://httpbin.org/delay/5 # 504
[root@k8s-master-node1 ~]# vim egress.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
? name: httpbin-ext
spec:
? hosts:
? ? - httpbin.org
? http:
? - timeout: 3s
? ? route:
? ? ? - destination:
? ? ? ? ? host: httpbin.org
? ? ? ? weight: 100
[root@k8s-master-node1 ~]# vim se-http.yaml
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
? name: httpbin-ext
spec:
? hosts:
? - httpbin.org
? ports:
? - number: 80
? ? name: http
? ? protocol: HTTP
? resolution: DNS
? location: MESH_EXTERNAL
5. 在 Kubernetes 集群中完成 HTTPBin 樣例程序的部署,然后在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 istio.yaml 創(chuàng)建 Ingress刀崖,具體要求如下:
(1)在端口 80 上配置 Ingress 以實(shí)現(xiàn) HTTP 流量惊科;
(2)Ingress 名稱:httpbin-ingress;
(3)允許流量流向路徑/status 和/delay亮钦;
(3)對(duì)外訪問的域名:httpbin.example.com译断。
[root@k8s-master-node1 ~]# vi ingress-myapp.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
? name: ingress-myapp
? namespace: ingress-nginx
? annotations:?
? ? kubernetes.io/ingress.class: "nginx"
spec:
? rules:
? - host: myapp.magedu.com
? ? http:
? ? ? paths:? ? ?
? ? ? - path:? /stats/*
? ? ? - path:? /delay/*
? ? ? ? backend:?
? ? ? ? ? serviceName: myapp
? ? ? ? ? servicePort: 80
kubevirt
基本操作:
[root@k8s-master-node1 ~]# vim Dockerfile
FROM kubevirt/registry-disk-v1alpha
MAINTAINER chinaskill
ADD CentOS-7-x86_64-2009.qcow2 /home/centos7.qcow2
[root@k8s-master-node1 ~]# docker build -t centos7:latest .
[root@k8s-master-node1 ~]# docker tag centos7:latest 172.100.0.22/library/centos7:latest
[root@k8s-master-node1 ~]# docker push? 172.100.0.22/library/centos7:latest
[root@k8s-master-node1 ~]# virtctl start VMI
[root@k8s-master-node1 ~]# virtctl console VMI
1.使用提供的 OpenStack qcow2 鏡像,在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件vm.yaml 創(chuàng)建 VM或悲,具體要求如下:
(1)VM 名稱:exam;
(2)要求內(nèi)存為 2Gi堪唐,CPU 為 1 核巡语;
(3)運(yùn)行策略:Always。
[root@k8s-master-node1 ~]# vim vm.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
? name: exam
spec:
#? running: false
? runStrategy: Always
? template:
? ? metadata:
? ? ? name: testvm
? ? spec:
? ? ? domain:
? ? ? ? devices:
? ? ? ? ? disks:
? ? ? ? ? - name: containerdisk
? ? ? ? ? ? disk:
? ? ? ? ? ? ? bus: virtio
? ? ? ? resources:
? ? ? ? ? requests:
? ? ? ? ? ? cpu: 1
? ? ? ? ? ? memory: 2Gi
? ? ? volumes:
? ? ? - name: containerdisk
? ? ? ? containerDisk:
? ? ? ? ? image: 172.100.0.22/library/centos7:latest
? ? ? ? ? path: /home/centos7.qcow2
2. 在 KubeVirt 中啟用實(shí)時(shí)遷移功能淮菠,以實(shí)現(xiàn)將一臺(tái)正在運(yùn)行的虛擬機(jī)實(shí)例從一個(gè)節(jié)點(diǎn)遷移到另一個(gè)節(jié)點(diǎn)男公,期間工作負(fù)載繼續(xù)運(yùn)行且能保持持續(xù)訪問。
[root@k8s-master-node1 ~]# kubectl edit -n kubevirt kubevirt kubevirt
spec:
? configuration:
? ? developerConfiguration:
? ? ? featureGates:
? ? ? - LiveMigration? ? ?
[root@k8s-master-node1 ~]# kubectl apply -f vmim-vm.yaml?
[root@k8s-master-node1 ~]# virtctl start testvm
[root@k8s-master-node1 ~]# kubectl apply -f vmim.yaml
[root@k8s-master-node1 ~]# virtctl migrate testvm
[root@k8s-master-node1 ~]# vim vmim-vm.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
? name: testvm
spec:
? running: false
? template:
? ? metadata:
? ? ? name: testvm
? ? spec:
? ? ? domain:
? ? ? ? devices:
? ? ? ? ? disks:
? ? ? ? ? ? - name: containerdisk
? ? ? ? ? ? ? disk:
? ? ? ? ? ? ? ? bus: virtio
? ? ? ? ? interfaces:
? ? ? ? ? - name: default
? ? ? ? ? ? masquerade: {}
? ? ? ? resources:
? ? ? ? ? requests:
? ? ? ? ? ? memory: 64M
? ? ? networks:
? ? ? - name: default
? ? ? ? pod: {}
? ? ? volumes:
? ? ? - name: containerdisk
? ? ? ? containerDisk:
? ? ? ? ? image: 172.100.0.22/library/centos7:latest
? ? ? ? ? path: /home/centos7.qcow2
[root@k8s-master-node1 ~]# vim vmim.yaml
apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachineInstanceMigration
metadata:
? name: migration-job
spec:
? vmiName: testvm
3.在 KubeVirt 中啟用快照/恢復(fù)支持功能合陵,然后在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML文件 snap.yaml 為虛擬實(shí)例 exam 創(chuàng)建一個(gè)快照枢赔,具體要求如下:
(1)快照名稱:exam-snap;
(2)創(chuàng)建快照超時(shí)時(shí)間:1min拥知。
[root@k8s-master-node1 ~]# kubectl apply -f kubevirt/vm.yaml # 運(yùn)行狀態(tài): running: flase
[root@k8s-master-node1 ~]# virtctl start exam
[root@k8s-master-node1 ~]# kubectl apply -f snap.yaml
[root@k8s-master-node1 ~]# virtctl stop exam
[root@k8s-master-node1 ~]# kubectl apply -f restore.yaml
[root@k8s-master-node1 ~]# virtctl start exam
[root@k8s-master-node1 ~]# kubectl edit -n kubevirt kubevirt kubevirt
spec:
? configuration:
? ? developerConfiguration:
? ? ? featureGates:
? ? ? - Snapshot
[root@k8s-master-node1 ~]# vim snap.yaml
apiVersion: snapshot.kubevirt.io/v1alpha1
kind: VirtualMachineSnapshot
metadata:
? name: exam-snap
spec:
? failureDeadline: 1m
? source:
? ? apiGroup: kubevirt.io
? ? kind: VirtualMachine
? ? name: exam
[root@k8s-master-node1 ~]# vim restore.yaml
apiVersion: snapshot.kubevirt.io/v1alpha1
kind: VirtualMachineRestore
metadata:
? name: exam-restore
spec:
? target:
? ? apiGroup: kubevirt.io
? ? kind: VirtualMachine
? ? name: exam
? virtualMachineSnapshotName: exam-snap
4.使用提供的 OpenStack qcow2 鏡像踏拜,在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件創(chuàng)建VMI,具體要求如下:
(1)VMI 名稱:chinaskill-vmi低剔;
(2)運(yùn)行策略:Manual速梗;
(3)磁盤驅(qū)動(dòng):virtio。
[root@k8s-master-node1 ~]# vim vmi.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachineInstance
metadata:
? name: chinaskill-vmi
spec:
? domain:
? ? devices:
? ? ? disks:
? ? ? - name: containerdisk
? ? ? ? disk:
? ? ? ? ? bus: virtio
? ? resources:
? ? ? requests:
? ? ? ? memory: 2Gi
? ? ? ? cpu: 1
? volumes:
? - name: containerdisk
? ? containerDisk:
? ? ? image: 172.100.0.22/library/centos7:latest
? ? ? path: /home/centos7.qcow2
5.使用提供的 OpenStack qcow2 鏡像(該鏡像內(nèi)部署有 Web 應(yīng)用)襟齿,在 master 節(jié)點(diǎn)/root目錄下編寫 YAM 文件 vmi.yaml 創(chuàng)建 VMI姻锁,具體要求如下:
(1)VMI 名稱:exam;
(2)允許節(jié)點(diǎn)資源過量使用猜欺;
(3)內(nèi)存為 8Gi位隶,CPU 為 4 核;
(4)運(yùn)行策略:RerunOnFailure开皿。
[root@k8s-master-node1 ~]# vim vmi-over.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachineInstance
metadata:
? name: exam
spec:
? domain:
? ? devices:
? ? ? disks:
? ? ? - name: containerdisk
? ? ? ? disk:
? ? ? ? ? bus: virtio
? ? resources:
? ? ? overcommitGuestOverhead: true
? ? ? requests:
? ? ? ? memory: 8Gi
? ? ? ? cpu: 4
? volumes:
? - name: containerdisk
? ? containerDisk:
? ? ? image: 172.100.0.22/library/centos7:latest
? ? ? path: /home/centos7.qcow2
6.使用提供的 OpenStack qcow2 鏡像涧黄,在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件vmi.yaml 創(chuàng)建 VMI篮昧,具體要求如下:
(1)VMI 名稱為 exam;
(2)內(nèi)存為 2Gi弓熏,CPU 為 1 核恋谭;
(3)啟動(dòng)命令:echo 123456 | passwd --stdin root。
(4)基于 Multus 多網(wǎng)絡(luò)方案為該 VMI 添加一個(gè)額外網(wǎng)絡(luò) macvlan挽鞠;
[root@k8s-master-node1 ~]# vim vmi-com-macvlan.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachineInstance
metadata:
? name: exam
spec:
? domain:
? ? devices:
? ? ? disks:
? ? ? - name: containerdisk
? ? ? ? disk:
? ? ? ? ? bus: virtio
? ? ? - name: configdrive
? ? ? ? disk:
? ? ? ? ? bus: virtio
? ? ? interfaces:
? ? ? - name: default
? ? ? ? bridge: {}
? ? ? - name: test
? ? ? ? bridge: {}
? ? resources:
? ? ? requests:
? ? ? ? memory: 2Gi
? ? ? ? cpu: 1
? networks:
? - name: test
? ? multus:
? ? ? networkName: macvlan
? - name: default
? ? pod: {}
? volumes:
? - name: containerdisk
? ? containerDisk:
? ? ? image: 172.100.0.22/library/centos7:latest
? ? ? path: /home/centos7.qcow2
? - name: configdrive
? ? cloudInitConfigDrive:
? ? ? userData: |
? ? ? ? #!/bin/bash
? ? ? ? sudo echo 123456 | passwd --stdin root
7.使用提供的 OpenStack qcow2 鏡像(該鏡像內(nèi)部署有 Web 應(yīng)用)疚颊,在 master 節(jié)點(diǎn)/root目錄下編寫 YAM 文件 vmi.yaml 創(chuàng)建 VMI,具體要求如下:
(1)VMI 名稱:exam信认;
(2)啟用 Istio 代理注入材义;
(3)內(nèi)存為 2Gi,CPU 為 1 核嫁赏;
(4)運(yùn)行策略:Always其掂。
[root@k8s-master-node1 ~]# kubectl label namespaces default istio-injection=enabled
[root@k8s-master-node1 ~]# kubectl get pod
[root@k8s-master-node1 ~]# kubectl get pods virt-launcher-vmi-istio-574hm -o jsonpath='{.spec.containers[*].name}'
[root@k8s-master-node1 ~]# istioctl proxy-ststus
[root@k8s-master-node1 ~]# vim vmi-istio.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachineInstance
metadata:
? annotations:
? ? sidecar.istio.io/inject: "true"
? labels:
? ? app: vmi-istio
? name: vmi-istio
spec:
? domain:
? ? devices:
? ? ? disks:
? ? ? - name: containerdisk
? ? ? ? disk:
? ? ? ? ? bus: virtio
? ? ? interfaces:
? ? ? ? - name: default
? ? ? ? ? masquerade: {}
? ? resources:
? ? ? requests:
? ? ? ? memory: 2Gi
? ? ? ? cpu: 1
? networks:
? ? - name: default
? ? ? pod: {}
? volumes:
? - name: containerdisk
? ? containerDisk:
? ? ? image: 172.100.0.22/library/centos7:latest
? ? ? path: /home/centos7.qcow2
8.使用提供的OpenStack qcow2鏡像,在master節(jié)點(diǎn)/root目錄下編寫YAML文件vm.yaml創(chuàng)建 VMI潦蝇,具體要求如下:
(1)VMI 名稱:vmi-ssh-static款熬;
(2)將 SSH 密鑰放入 Kubernetes 密鑰并注入到 VMI 中;
(3)內(nèi)存為 2Gi攘乒,CPU 為 1000m贤牛。
[root@k8s-master-node1 ~]# kubectl create secret generic my-pub-key --from-file=key=.ssh/id_rsa.pub
[root@k8s-master-node1 ~]# vim vmi-static.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachineInstance
metadata:
? name: vmi-ssh-static
spec:
? domain:
? ? devices:
? ? ? disks:
? ? ? - name: containerdisk
? ? ? ? disk:
? ? ? ? ? bus: virtio
? ? ? - name: configdrive
? ? ? ? disk:
? ? ? ? ? bus: virtio
? ? resources:
? ? ? requests:
? ? ? ? memory: 2Gi
? ? ? ? cpu: 1
? accessCredentials:
? - sshPublicKey:
? ? ? source:
? ? ? ? secret:
? ? ? ? ? secretName: my-pub-key
? ? ? propagationMethod:
? ? ? ? configDrive: {}
? volumes:
? - name: containerdisk
? ? containerDisk:
? ? ? image: 172.100.0.22/library/centos7:latest
? ? ? path: /home/centos7.qcow2
? - name: configdrive
? ? cloudInitConfigDrive:
? ? ? userData: |
? ? ? ? #!/bin/bash
? ? ? ? echo "test
9.在 master 節(jié)點(diǎn)上編寫 YAML 文件 vmi-sshkey.yaml 為虛擬實(shí)例 chinaskill-vmi 進(jìn)行動(dòng)態(tài)密鑰注入,具體要求如下:
(1)使用 qemuGuestAgent 將訪問憑證 api 附加到 chinaskill-vmi则酝。
[root@k8s-master-node1 ~]# kubectl create secret generic my-pub-key --from-file=key=.ssh/id_rsa.pub
[root@k8s-master-node1 ~]# vim vmi-ssh.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachineInstance
metadata:
? name: vmi-ssh-static
spec:
? domain:
? ? devices:
? ? ? disks:
? ? ? - name: containerdisk
? ? ? ? disk:
? ? ? ? ? bus: virtio
? ? ? - name: configdrive
? ? ? ? disk:
? ? ? ? ? bus: virtio
? ? resources:
? ? ? requests:
? ? ? ? memory: 2Gi
? ? ? ? cpu: 1
? accessCredentials:
? - sshPublicKey:
? ? ? source:
? ? ? ? secret:
? ? ? ? ? secretName: my-pub-key
? ? ? propagationMethod:
? ? ? ? qemuGuestAgent:
? ? ? ? ? users:
? ? ? ? ? - "root"
? volumes:
? - name: containerdisk
? ? containerDisk:
? ? ? image: 172.100.0.22/library/centos7:latest
? ? ? path: /home/centos7.qcow2
? - name: configdrive
? ? cloudInitConfigDrive:
? ? ? userData: |
? ? ? ? #!/bin/bash
? ? ? ? echo "test
10.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 vmi-service.yaml 為 VMI 內(nèi)部應(yīng)用創(chuàng)建Service殉簸,具體要求如下:
(1)Service 名稱:vmi-service
(2)訪問方式:NodePort;
(3)將 VMI 的 80 端口對(duì)外暴露為 30888沽讹。
[root@k8s-master-node1 ~]# vim vmi-server.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachineInstance
metadata:
? name: exam
? labels:
? ? app: vmi
spec:
? domain:
? ? devices:
? ? ? disks:
? ? ? - name: containerdisk
? ? ? ? disk:
? ? ? ? ? bus: virtio
? ? resources:
? ? ? requests:
? ? ? ? memory: 2Gi
? ? ? ? cpu: 1
? volumes:
? - name: containerdisk
? ? containerDisk:
? ? ? image: 172.100.0.22/library/centos7:latest
? ? ? path: /home/centos7.qcow2
---
apiVersion: v1
kind: Service
metadata:
? name: vmi-service
spec:
? externalTrafficPolicy: Cluster
? type: NodePort
? selector:
? ? app: vmi
? ports:
? - name: nodeport
? ? nodePort: 30888
? ? port: 80
? ? protocol: TCP
11.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 hpa.yaml 創(chuàng)建 HorizontalPodAutoscaler 對(duì)象般卑,具體要求如下:
(1)名稱:exam-hpa;
(2)將其關(guān)聯(lián)到虛擬實(shí)例 exam爽雄;
(3)VMI 的最小副本數(shù)為 1蝠检,最大副本數(shù)為 3
(4)要求 VMI 根據(jù)設(shè)定的 CPU 使用率 70%動(dòng)態(tài)伸縮。
[root@k8s-master-node1 ~]# vim vmi-rs.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachineInstanceReplicaSet
metadata:
? name: exam
spec:
? replicas: 2
? selector:
? ? matchLabels:
? ? ? myvmi: myvmi
? template:
? ? metadata:
? ? ? name: exam
? ? ? labels:
? ? ? ? myvmi: myvmi
? ? spec:
? ? ? domain:
? ? ? ? devices:
? ? ? ? ? disks:
? ? ? ? ? - disk:
? ? ? ? ? ? name: containerdisk
? ? ? ? resources:
? ? ? ? ? requests:
? ? ? ? ? ? memory: 64M
? ? ? volumes:
? ? ? - name: containerdisk
? ? ? ? containerDisk:
? ? ? ? ? image: 172.100.0.22/library/centos7:latest
? ? ? ? ? path: /home/centos7.qcow2
[root@k8s-master-node1 ~]# vim vmi-hpa.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
? name: exam-hpa
spec:
? maxReplicas: 3
? minReplicas: 1
? scaleTargetRef:
? ? kind: VirtualMachineInstanceReplicaSet
? ? name: exam
? ? apiVersion: kubevirt.io/v1
? targetCPUUtilizationPercentage: 70
12.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 vmi-role.yaml 創(chuàng)建 RBAC 角色挚瘟,具體要求如下:
(1)角色名稱:vm-role蝇率;
(2)該角色對(duì) VM 擁有 get、delete刽沾、create、update、patch 和 list 權(quán)限浪腐。
[root@k8s-master-node1 ~]# vim role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
? name: vm-role
rules:
? - apiGroups: ["kubevirt.io"]
? ? resources: ["virtualmachines"]
? ? verbs: ["get, delete, create, update, patch, list"]
13.在 master 節(jié)點(diǎn)/root 目錄下編寫 YAML 文件 vmi-network.yaml 為 VM 創(chuàng)建網(wǎng)絡(luò)策略,具體要求如下:
(1)策略名稱:deny-by-default特漩;
(2)要求 VM 僅允許來自同一命名空間內(nèi)的 VM 的 HTTP 和 HTTPS 訪問請(qǐng)求。
[root@k8s-master-node1 ~]# vim vmi-np.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
? name: deny-by-default
spec:
? podSelector: {}
? ingress:
? - ports:
? ? - protocol: TCP
? ? ? port: 8080
? ? - protocol: TCP
? ? ? port: 8443
dokcer
CICD