内容简介
本实验手册系列包含七个主题,涵盖了从应用容器化到 GitOps 工作流的实现与高级特性。通过这些实验手册,您将学习到如何构建、部署和管理应用,以及如何在 Kubernetes 集群上实现高效的持续交付流程。
以下是实验手册的七个章节:
- 应用程序容器化实验手册:学习如何将应用程序容器化,并为主流编程语言构建镜像。同时,了解如何缩减镜像体积和使用 GitHub Actions 自动构建镜像。
- 单节点 Kubernetes 集群部署实验手册:使用 kind 在本地部署单节点 Kubernetes 集群,安装基础服务,并熟悉 Kubernetes 的基本功能,如运行 Pod、调度工作负载、服务发布和自动扩缩容。
- 示例应用的部署和解析实验手册:深入了解示例应用的各个组件,学习如何在 Kubernetes 集群上部署、运行和管理这些组件,实现服务调用、应用配置和扩缩容等功能。
- 使用 Helm 定义应用实验手册:通过 Helm 对示例应用进行定义,以满足 GitOps 部署的需求。了解 Helm Chart 的创建和使用,以及预发布和生产环境的部署。
- 构建 GitOps 工作流实验手册:在 Kubernetes 集群上安装 ArgoCD,并使用 ArgoCD 定义示例应用进行部署,实现基于镜像版本变化触发的 GitOps 工作流。
- 实现 GitOps 高级发布策略实验手册:结合 ArgoCD 的高级特性,如 Argo Rollout、AnalysisTemplate 和 Argo Rollout Dashboard,实现蓝绿发布、金丝雀发布和自动渐进交付。
- ArgoCD 高级管理特性实验手册:探讨 ArgoCD 在 GitOps 场景中的高级特性,包括使用 ApplicationSet 实现多环境部署和使用 SealedSecret 保护密钥。
通过这七个实验手册,您将全面掌握应用容器化、Kubernetes 和 GitOps 的相关知识,为应用的持续交付提供可靠和高效的解决方案。
本章旨在指导您使用Kind部署一个单节点的Kubernetes集群,并实践Kubernetes的基本功能。Kind是一个用于运行本地Kubernetes集群的工具,它非常适合测试和学习目的。在本手册中,您将学习到如何部署Kubernetes集群、安装基础集群服务,以及实践核心功能,如运行Pods,使用Deployments调度工作负载,发布服务,以及自动扩缩容。
部署 Kind 群集
安装 docker
安装 docker, (1.23 还能支持 docker 作为容器运行时, 考虑到 docker 可以兼容更多的实验场景, 所以此例中保留使用 docker)
apt -y install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt update -y
apt install docker-ce -y
可选, 国际互联网直达安装方式
# curl -sSL https://get.docker.com/ | sh
# usermod -aG docker chengzh
mkdir /etc/docker
cat > /etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "10"
},
"registry-mirrors": ["https://pqbap4ya.mirror.aliyuncs.com"]
}
EOF
systemctl restart docker
systemctl enable docker
安装 kubelet
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat > /etc/apt/sources.list.d/kubernetes.list << EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt update -y
安装当前最新版本
apt install -y kubelet kubeadm kubectl
(可选)安装指定版本此次,以 1.23.00
为例
apt install -y kubelet=1.23.0-00 kubeadm=1.23.0-00 kubectl=1.23.0-00
安装 Kind
官方方式
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.17.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
加速方式
curl -Lo ./kind https://chengzhstor.blob.core.windows.net/k8slab/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
创建实验用群集(单节点)
创建群集配置文件
nano config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
apiServerAddress: "192.168.1.231" # 使用虚机的IP,其他场景则设置为 127.0.0.1
apiServerPort: 6443
nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "ingress-ready=true"
extraPortMappings:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
创建群集
kind create cluster --config config.yaml
root@node1:~# kind create cluster --config config.yaml
Creating cluster "kind" ...
✓ Ensuring node image (kindest/node:v1.25.3) 🖼
✓ Preparing nodes 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
Set kubectl context to "kind-kind"
You can now use your cluster with:
kubectl cluster-info --context kind-kind
Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂
root@node1:~# kubectl cluster-info --context kind-kind
Kubernetes control plane is running at https://192.168.1.231:6443
CoreDNS is running at https://192.168.1.231:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
查看群集节点
kubectl get node -o wide
root@node1:~# kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
kind-control-plane Ready control-plane 3m32s v1.25.3 172.18.0.2 <none> Ubuntu 22.04.1 LTS 5.4.0-107-generic containerd://1.6.9
查看目前的pod
kubectl get pod -o wide -A
root@node1:~# kubectl get pod -o wide -A
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system coredns-565d847f94-7j587 1/1 Running 0 24s 10.244.0.4 kind-control-plane <none> <none>
kube-system coredns-565d847f94-gqpnw 1/1 Running 0 24s 10.244.0.3 kind-control-plane <none> <none>
kube-system etcd-kind-control-plane 1/1 Running 0 38s 172.18.0.2 kind-control-plane <none> <none>
kube-system kindnet-2tpcs 1/1 Running 0 24s 172.18.0.2 kind-control-plane <none> <none>
kube-system kube-apiserver-kind-control-plane 1/1 Running 0 39s 172.18.0.2 kind-control-plane <none> <none>
kube-system kube-controller-manager-kind-control-plane 1/1 Running 0 37s 172.18.0.2 kind-control-plane <none> <none>
kube-system kube-proxy-76lx7 1/1 Running 0 24s 172.18.0.2 kind-control-plane <none> <none>
kube-system kube-scheduler-kind-control-plane 1/1 Running 0 37s 172.18.0.2 kind-control-plane <none> <none>
local-path-storage local-path-provisioner-684f458cdd-2jfl4 1/1 Running 0 24s 10.244.0.2 kind-control-plane <none> <none>
安装基础群集服务
安装ingress
kubectl create -f https://ghproxy.com/https://raw.githubusercontent.com/cloudzun/resource/main/ingress-nginx/ingress-nginx.yaml
安装metrics
kubectl apply -f https://ghproxy.com/https://raw.githubusercontent.com/cloudzun/resource/main/metrics/metrics.yaml
安装 helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
(可选)打印kubeconfig文件
cat $HOME/.kube/config
(可选) 安装 Prometheus
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm upgrade prometheus prometheus-community/kube-prometheus-stack \
--namespace prometheus --create-namespace --install \
--set prometheus.prometheusSpec.podMonitorSelectorNilUsesHelmValues=false \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false
Kubernetes 基本功能测试
在Kubernetes 群集上运行pod
创建Pod定义文件
nano flask-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: hello-world-flask
spec:
containers:
- name: flask
image: chengzh/hello-world-flask:latest
ports:
- containerPort: 5000
运行pod
kubectl apply -f flask-pod.yaml
root@node1:~# kubectl apply -f flask-pod.yaml
pod/hello-world-flask created
root@node1:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-world-flask 0/1 ContainerCreating 0 6s
root@node1:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-world-flask 1/1 Running 0 7m10s
端口映射
kubectl port-forward pod/hello-world-flask 8000:5000
root@node1:~# kubectl port-forward pod/hello-world-flask 8000:5000
Forwarding from 127.0.0.1:8000 -> 5000
Forwarding from [::1]:8000 -> 5000
Handling connection for 8000
打开另外一个终端会话进行访问
curl localhost:8000
root@node1:~# curl localhost:8000
Hello, my first docker images! hello-world-flaskroot@node1:~#
如果是在常规Kubernetes 环境中进行实验参考以下步骤
controlplane $ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hello-world-flask 1/1 Running 0 14s 192.168.1.3 node01 <none> <none>
controlplane $ curl 192.168.1.3
curl: (7) Failed to connect to 192.168.1.3 port 80: Connection refused
controlplane $ curl 192.168.1.3:5000
Hello, my first docker images! hello-world-flaskcontrolplane $
删除 pod
kubectl delete -f flask-pod.yaml
root@node1:~# kubectl delete -f flask-pod.yaml
pod "hello-world-flask" deleted
创建实验工作负载
创建 deployment
kubectl create deployment hello-world-flask --image=chengzh/hello-world-flask:latest --replicas=2
创建 service
kubectl create service clusterip hello-world-flask --tcp=5000:5000
创建 ingress
kubectl create ingress hello-world-flask --rule="/=hello-world-flask:5000"
部署 ingress-nginx
kubectl create -f https://ghproxy.com/https://raw.githubusercontent.com/lyzhang1999/resource/main/ingress-nginx/ingress-nginx.yaml
(可选)如果使用非kind环境,比如sandbox上,则需要为某个节点打标签 ingress-ready: "true"
kubectl label node node01 ingress-ready=true
- Pod 会被 Deployment 工作负载管理起来,例如创建和销毁等;
- Service 相当于弹性伸缩组的负载均衡器,它能以加权轮训的方式将流量转发到多个 Pod 副本上;
- Ingress 相当于集群的外网访问入口。
工作负载自愈
打开另外一个会话窗口访问服务
while true; do sleep 1; curl http://127.0.0.1; echo -e '\n'$(date);done
有了 Ingress,我们访问 Pod 就不再需要进行端口转发了,我们可以直接访问 127.0.0.1。上面的命令会每隔 1 秒钟发送一次请求,并打印出时间和返回内容:
root@node1:~# while true; do sleep 1; curl http://127.0.0.1; echo -e '\n'$(date);done
Hello, my first docker images! hello-world-flask-6bdf7b45dc-5tdzs
Mon 06 Feb 2023 12:01:40 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-hnvqm
Mon 06 Feb 2023 12:01:41 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-5tdzs
Mon 06 Feb 2023 12:01:42 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-5tdzs
Mon 06 Feb 2023 12:01:43 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-hnvqm
Mon 06 Feb 2023 12:01:44 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-hnvqm
Mon 06 Feb 2023 12:01:45 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-5tdzs
Mon 06 Feb 2023 12:01:46 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-hnvqm
Mon 06 Feb 2023 12:01:47 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-5tdzs
Mon 06 Feb 2023 12:01:48 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-5tdzs
Mon 06 Feb 2023 12:01:49 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-hnvqm
Mon 06 Feb 2023 12:01:50 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-5tdzs
Mon 06 Feb 2023 12:01:51 PM CST
在这里,“Hello, my first docker images” 后面紧接的内容是 Pod 名称。通过返回内容我们会发现,请求被平均分配到了两个 Pod 上,Pod 名称是交替出现的。我们要保留这个命令行窗口,以便继续观察。
如果使用非kind环境,需要使用此前打标签的机器的名称或者地址进行观察
while true; do sleep 1; curl node01; echo -e '\n'$(date);done
模拟某个pod失效
kubectl get pod
root@node1:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-world-flask-6bdf7b45dc-5tdzs 1/1 Running 0 12m
hello-world-flask-6bdf7b45dc-hnvqm 1/1 Running 0 12m
kubectl delete pod hello-world-flask-6bdf7b45dc-5tdzs
所有的流量被压在另一个正常的pod
Hello, my first docker images! hello-world-flask-6bdf7b45dc-hnvqm
Mon 06 Feb 2023 12:08:31 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-hnvqm
Mon 06 Feb 2023 12:08:32 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-hnvqm
Mon 06 Feb 2023 12:08:33 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-hnvqm
Mon 06 Feb 2023 12:08:34 PM CST
新pod上线后,流量在新旧两个pod上负载均衡
Hello, my first docker images! hello-world-flask-6bdf7b45dc-qbvf2
Mon 06 Feb 2023 12:08:35 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-hnvqm
Mon 06 Feb 2023 12:08:36 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-qbvf2
Mon 06 Feb 2023 12:08:37 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-qbvf2
Mon 06 Feb 2023 12:08:38 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-hnvqm
Mon 06 Feb 2023 12:08:39 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-qbvf2
Mon 06 Feb 2023 12:08:40 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-hnvqm
Mon 06 Feb 2023 12:08:41 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-qbvf2
Mon 06 Feb 2023 12:08:42 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-hnvqm
Mon 06 Feb 2023 12:08:43 PM CST
Hello, my first docker images! hello-world-flask-6bdf7b45dc-qbvf2
再次查看pod列表
kubectl get pod
root@node1:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-world-flask-6bdf7b45dc-hnvqm 1/1 Running 0 17m
hello-world-flask-6bdf7b45dc-qbvf2 1/1 Running 0 2m1s
首先, K8s 感知到了业务 Pod 故障,立刻进行了故障转移并隔离了有故障的 Pod,并将请求转发到了其他健康的 Pod 中。随后重启了有故障的 Pod,最后将重启后的 Pod 加入到了负载均衡并开始接收外部请求。这些过程都是自动化完成的。
自动扩容
(可选)安装 metrics
kubectl apply -f https://ghproxy.com/https://raw.githubusercontent.com/lyzhang1999/resource/main/metrics/metrics.yaml
kubectl wait deployment -n kube-system metrics-server --for condition=Available=True --timeout=90s
创建自动扩缩容策略
kubectl autoscale deployment hello-world-flask --cpu-percent=50 --min=2 --max=10
root@node1:~# kubectl autoscale deployment hello-world-flask --cpu-percent=50 --min=2 --max=10
horizontalpodautoscaler.autoscaling/hello-world-flask autoscaled
为deployment注入资源配额
kubectl patch deployment hello-world-flask --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/resources", "value": {"requests": {"memory": "100Mi", "cpu": "100m"}}}]'
root@node1:~# kubectl patch deployment hello-world-flask --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/resources", "value": {"requests": {"memory": "100Mi", "cpu": "100m"}}}]'
deployment.apps/hello-world-flask patched
root@node1:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-world-flask-5d4494cc9b-5p7vx 1/1 Running 0 12s
hello-world-flask-5d4494cc9b-jmwxd 1/1 Running 0 8s
hello-world-flask-6bdf7b45dc-hnvqm 1/1 Terminating 0 31m
hello-world-flask-6bdf7b45dc-qbvf2 1/1 Terminating 0 15m
root@node1:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-world-flask-5d4494cc9b-5p7vx 1/1 Running 0 49s
hello-world-flask-5d4494cc9b-jmwxd 1/1 Running 0 45s
进入到某一个pod的上下文
kubectl exec -it kubectl exec -it hello-world-flask-5d4494cc9b-jmwxd -- bash
模拟业务高峰场景
ab -c 50 -n 10000 http://127.0.0.1:5000/
在这条压力测试的命令中,-c 代表 50 个并发数,-n 代表一共请求 10000 次,整个过程大概会持续十几秒。
root@node1:~# kubectl exec -it hello-world-flask-5d4494cc9b-jmwxd -- bash
root@hello-world-flask-5d4494cc9b-jmwxd:/app# ab -c 50 -n 10000 http://127.0.0.1:5000/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: Werkzeug/2.2.2
Server Hostname: 127.0.0.1
Server Port: 5000
Document Path: /
Document Length: 65 bytes
Concurrency Level: 50
Time taken for tests: 9.177 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 2380000 bytes
HTML transferred: 650000 bytes
Requests per second: 1089.67 [#/sec] (mean)
Time per request: 45.886 [ms] (mean)
Time per request: 0.918 [ms] (mean, across all concurrent requests)
Transfer rate: 253.26 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 2
Processing: 2 46 5.6 44 80
Waiting: 1 45 5.5 44 80
Total: 2 46 5.6 44 80
Percentage of the requests served within a certain time (ms)
50% 44
66% 46
75% 48
80% 49
90% 53
95% 56
98% 60
99% 63
100% 80 (longest request)
再开一个会话窗口(对,第三个)
kubectl get pods --watch
root@node1:~# kubectl get pods --watch
NAME READY STATUS RESTARTS AGE
hello-world-flask-5d4494cc9b-5p7vx 1/1 Running 0 8m
hello-world-flask-5d4494cc9b-87vx2 1/1 Running 0 51s
hello-world-flask-5d4494cc9b-bwh5s 1/1 Running 0 66s
hello-world-flask-5d4494cc9b-jmwxd 1/1 Running 0 7m56s
hello-world-flask-5d4494cc9b-mn4w9 1/1 Running 0 66s
hello-world-flask-5d4494cc9b-r5fh5 1/1 Running 0 51s
hello-world-flask-5d4494cc9b-trsm4 0/1 Pending 0 36s
hello-world-flask-5d4494cc9b-vvn9v 0/1 Pending 0 36s
hello-world-flask-5d4494cc9b-vx2kb 1/1 Running 0 51s
hello-world-flask-5d4494cc9b-xkqxv 1/1 Running 0 51s
参数 --watch
表示持续监听 Pod 状态变化。在 ab 压力测试的过程中,会不断创建新的 Pod 副本,这说明 K8s 已经感知到了 Pod 的业务压力,并且正在自动进行横向扩容
延长时间会观测到自动缩容
root@node1:~# kubectl get pods --watch
NAME READY STATUS RESTARTS AGE
hello-world-flask-5d4494cc9b-5p7vx 1/1 Running 0 8m
hello-world-flask-5d4494cc9b-87vx2 1/1 Running 0 51s
hello-world-flask-5d4494cc9b-bwh5s 1/1 Running 0 66s
hello-world-flask-5d4494cc9b-jmwxd 1/1 Running 0 7m56s
hello-world-flask-5d4494cc9b-mn4w9 1/1 Running 0 66s
hello-world-flask-5d4494cc9b-r5fh5 1/1 Running 0 51s
hello-world-flask-5d4494cc9b-trsm4 0/1 Pending 0 36s
hello-world-flask-5d4494cc9b-vvn9v 0/1 Pending 0 36s
hello-world-flask-5d4494cc9b-vx2kb 1/1 Running 0 51s
hello-world-flask-5d4494cc9b-xkqxv 1/1 Running 0 51s
hello-world-flask-5d4494cc9b-trsm4 0/1 Terminating 0 4m30s
hello-world-flask-5d4494cc9b-vvn9v 0/1 Terminating 0 4m30s
hello-world-flask-5d4494cc9b-trsm4 0/1 Terminating 0 4m30s
hello-world-flask-5d4494cc9b-vvn9v 0/1 Terminating 0 4m30s
hello-world-flask-5d4494cc9b-bwh5s 1/1 Terminating 0 5m30s
hello-world-flask-5d4494cc9b-vx2kb 1/1 Terminating 0 5m15s
hello-world-flask-5d4494cc9b-r5fh5 1/1 Terminating 0 5m15s
hello-world-flask-5d4494cc9b-xkqxv 1/1 Terminating 0 5m15s
hello-world-flask-5d4494cc9b-mn4w9 1/1 Terminating 0 5m30s
hello-world-flask-5d4494cc9b-87vx2 1/1 Terminating 0 5m15s
hello-world-flask-5d4494cc9b-xkqxv 0/1 Terminating 0 5m46s
hello-world-flask-5d4494cc9b-xkqxv 0/1 Terminating 0 5m46s
hello-world-flask-5d4494cc9b-xkqxv 0/1 Terminating 0 5m46s
hello-world-flask-5d4494cc9b-mn4w9 0/1 Terminating 0 6m1s
hello-world-flask-5d4494cc9b-mn4w9 0/1 Terminating 0 6m1s
hello-world-flask-5d4494cc9b-mn4w9 0/1 Terminating 0 6m1s
hello-world-flask-5d4494cc9b-vx2kb 0/1 Terminating 0 5m46s
hello-world-flask-5d4494cc9b-vx2kb 0/1 Terminating 0 5m46s
hello-world-flask-5d4494cc9b-vx2kb 0/1 Terminating 0 5m46s
hello-world-flask-5d4494cc9b-87vx2 0/1 Terminating 0 5m47s
hello-world-flask-5d4494cc9b-87vx2 0/1 Terminating 0 5m47s
hello-world-flask-5d4494cc9b-87vx2 0/1 Terminating 0 5m47s
hello-world-flask-5d4494cc9b-bwh5s 0/1 Terminating 0 6m2s
hello-world-flask-5d4494cc9b-bwh5s 0/1 Terminating 0 6m3s
hello-world-flask-5d4494cc9b-bwh5s 0/1 Terminating 0 6m3s
hello-world-flask-5d4494cc9b-r5fh5 0/1 Terminating 0 5m48s
hello-world-flask-5d4494cc9b-r5fh5 0/1 Terminating 0 5m48s
hello-world-flask-5d4494cc9b-r5fh5 0/1 Terminating 0 5m48s
root@node1:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-world-flask-5d4494cc9b-5p7vx 1/1 Running 0 15m
hello-world-flask-5d4494cc9b-jmwxd 1/1 Running 0 15m
后记
本课程体系旨在为学员提供一套全面的云原生技术学习路径,包括容器技术、Kubernetes 部署和管理、Ingress 管理、持久化存储、应用部署、可观测性、服务网格、DevOps 工具链和流水线以及 GitOps 等方面的内容。通过学习这套课程体系,学员将掌握云原生技术的关键概念、原理和实践方法,从而提升云原生应用的部署、管理和协作效率。
- Docker 技术实战:学习容器技术的基础知识,包括 Docker 的运作原理、核心组件以及应用部署和监控管理。
- Kubernetes 部署和管理实战:深入了解 Kubernetes 的核心概念和基础组件,掌握 Kubernetes 集群的部署、管理和监控技能。
- Kubernetes Ingress 管理与运维:学习 Kubernetes Ingress 的概念、工作机制和运维管理方法,提升 Ingress 的部署和管理能力。
- Kubernetes 持久化存储实践:探讨 Kubernetes 持久化存储的原理、实现方式和实际应用,提高在 Kubernetes 上实现持久化存储的能力。
- Kubernetes 应用部署和管理:学习 Kubernetes 应用部署和管理的基本概念、原理和实现方法,掌握在 Kubernetes 上部署和管理应用的技巧。
- Kubernetes 可观测性实践:研究 Kubernetes 可观测性实践的概念、原理和实现方法,涉及监控、日志记录和分析等方面。
- 基于 Istio 的服务网格实战:深入了解基于 Istio 的服务网格概念、原理和实现方法,包括服务路由、流量管理、弹性能力和微服务可观测性等。
- DevOps 工具链与流水线实践:探讨 DevOps 工具链与流水线的概念、原理和实现方法,涵盖自动化构建、测试、部署和监控等环节。
- GitOps 云原生应用的高效部署与管理:全面掌握 GitOps 原理、技术和工具,提高云原生应用部署、管理和协作效率。
通过对这九门课程的学习,学员可以:
- 熟练运用 Docker 和 Kubernetes 进行容器化应用的部署和管理。
- 掌握 Ingress 和持久化存储在 Kubernetes 集群中的配置和管理方法。
- 了解 Kubernetes 可观测性实践,提高应用监控、日志和分析的能力。
- 探究 Istio 服务网格的原理和实现,实现微服务的高可用、弹性和安全。
- 运用 DevOps 工具链和流水线实现自动化构建、测试、部署和监控。
- 掌握 GitOps 的原理和技术,提升云原生应用的部署、管理和协作效率。
本课程体系适合对云原生技术感兴趣的开发者、运维工程师、架构师等专业人士。课程内容丰富、实践性强,旨在帮助学员在实际工作中更好地应用云原生技术,为企业的数字化转型做出贡献。
如果希望获得更详细的课程介绍,请联系: info@cloudzun.com