K8S

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妒潭,一起剝皮案震驚了整個(gè)濱河市漠酿,隨后出現(xiàn)的幾起案子团驱,更是在濱河造成了極大的恐慌,老刑警劉巖紊选,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卖词,死亡現(xiàn)場(chǎng)離奇詭異即横,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弥鹦,“玉大人膝晾,你說我怎么就攤上這事幻赚。” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵钻蔑,是天一觀的道長蒲肋。 經(jīng)常有香客問我,道長剃法,這世上最難降的妖魔是什么晋柱? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上德挣,老公的妹妹穿的比我還像新娘。我一直安慰自己屯掖,他們只是感情好右蒲,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布间坐。 她就那樣靜靜地躺著蜈七,像睡著了一般。 火紅的嫁衣襯著肌膚如雪庵芭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天雀监,我揣著相機(jī)與錄音双吆,去河邊找鬼。 笑死滔悉,一個(gè)胖子當(dāng)著我的面吹牛回官,可吹牛的內(nèi)容都是我干的侄泽。 我是一名探鬼主播司草,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了区匣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤躬厌,失蹤者是張志新(化名)和其女友劉穎谍肤,沒想到半個(gè)月后贺奠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袁波,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年信卡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桥嗤。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡衡奥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出确虱,到底是詐尸還是另有隱情含友,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布校辩,位于F島的核電站窘问,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宜咒。R本人自食惡果不足惜惠赫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望故黑。 院中可真熱鬧儿咱,春花似錦、人聲如沸场晶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诗轻。三九已至钳宪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扳炬,已是汗流浹背吏颖。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恨樟,地道東北人半醉。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像劝术,于是被迫代替她去往敵國和親奉呛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容