Skip to content

Commit 6f72639

Browse files
committed
[N/A] feat: fix document in README.md
1 parent 1a1f4eb commit 6f72639

13 files changed

Lines changed: 1657 additions & 4 deletions

File tree

README.md

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,60 @@
1+
<h1 align=center>Kubernetes Tutorials | <a href="https://github.com/guangzhengli/k8s-tutorials" rel="nofollow">Repository</a></h1>
2+
3+
[![GitHub forks](https://img.shields.io/github/forks/guangzhengli/k8s-tutorials)](https://github.com/guangzhengli/k8s-tutorials/network)[![GitHub stars](https://img.shields.io/github/stars/guangzhengli/k8s-tutorials)](https://github.com/guangzhengli/k8s-tutorials/stargazers)[![GitHub issues](https://img.shields.io/github/issues/guangzhengli/k8s-tutorials)](https://github.com/guangzhengli/k8s-tutorials/issues)[![GitHub license](https://img.shields.io/github/license/guangzhengli/k8s-tutorials)](https://github.com/guangzhengli/k8s-tutorials/blob/main/LICENSE)
4+
5+
<h4 align=center>🌈 Kubernetes | 📰 Tutorials</h4>
6+
7+
k8s 作为云原生时代的操作系统,学习它的必要性不言而喻,如果你遇到了任何问题,可以在 [Discussions](https://github.com/guangzhengli/k8s-tutorials/discussions) 中评论或者 Issue 中提出,如果你觉得这个仓库对你有价值,欢迎 start 或者提 PR / Issue,让它变得更好!
8+
9+
这里是文档的索引:
10+
* [准备工作](docs/pre.md)
11+
* [container](docs/container.md)
12+
* [pod](docs/pod.md)
13+
* [deployment](docs/deployment.md)
14+
* [service](docs/service.md)
15+
* [ingress](docs/ingress.md)
16+
* [namespace](docs/namespace.md)
17+
* [configmap](docs/configmap.md)
18+
* [secret](docs/secret.md)
19+
* [job/cronjob](docs/job.md)
20+
* [helm(待完成)](docs/helm.md)
21+
* [dashboard(待完成)](docs/dashboard.md)
22+
23+
下面是所有文档的集合:
24+
25+
- [kubernetes tutorials](#kubernetes-tutorials)
26+
- [准备工作](#准备工作)
27+
- [安装 docker](#安装-docker)
28+
- [安装 minikube](#安装-minikube)
29+
- [安装 k8s CLI 和 Terminal based UI](#安装-k8s-cli-和-terminal-based-ui)
30+
- [注册 docker hub 账号登录](#注册-docker-hub-账号登录)
31+
- [Container](#container)
32+
- [Pod](#pod)
33+
- [Pod 与 Container 的不同](#pod-与-container-的不同)
34+
- [Pod 其它命令](#pod-其它命令)
35+
- [Deployment](#deployment)
36+
- [扩容](#扩容)
37+
- [升级版本](#升级版本)
38+
- [Rolling Update(滚动更新)](#rolling-update滚动更新)
39+
- [存活探针 (livenessProb)](#存活探针-livenessprob)
40+
- [就绪探针 (readiness)](#就绪探针-readiness)
41+
- [Service](#service)
42+
- [ClusterIP](#clusterip)
43+
- [NodePort](#nodeport)
44+
- [LoadBalancer](#loadbalancer)
45+
- [ingress](#ingress)
46+
- [Namespace](#namespace)
47+
- [Configmap](#configmap)
48+
- [Secret](#secret)
49+
- [Job](#job)
50+
- [CronJob](#cronjob)
51+
- [Helm(TODO)](#helmtodo)
52+
- [安装 hellok8s chart 快速开始(TODO)](#安装-hellok8s-chart-快速开始todo)
53+
- [创建 helm charts](#创建-helm-charts)
54+
- [上传和下载其它 helm chart 使用 (TODO)](#上传和下载其它-helm-chart-使用-todo)
55+
- [Dashboard(TODO)](#dashboardtodo)
56+
- [K9s(TODO)](#k9stodo)
57+
158
# kubernetes tutorials
259

360
## 准备工作
@@ -1215,10 +1272,6 @@ curl http://localhost:3000
12151272
# [v4] Hello, Kubernetes! From host: hellok8s-pod, Get Database Connect URL: http://DB_ADDRESS_TEST
12161273
```
12171274

1218-
作业:如果环境变量有很多的话,还需要这样一个一个写吗?去官网找一种将所有环境变量都挂载的方式。
1219-
1220-
如何代码不是从环境变量中读取数据,而是从文件中读取呢?去官网找一种将 configmap 挂载到容器文件的方式。
1221-
12221275
## Secret
12231276

12241277
上面提到,我们会选择以 configmap 的方式挂载配置信息,但是当我们的配置信息需要加密的时候, configmap 就无法满足这个要求。例如上面要挂载数据库密码的时候,就需要明文挂载。

doc/configmap.md

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
## Configmap
2+
3+
上面的教程提到,我们在不同环境 `dev` `test` `uat` `prod` 中区分资源,可以让其资源独立互相不受影响,但是随之而来也会带来一些问题,例如不同环境的数据库的地址往往是不一样的,那么如果在代码中写同一个数据库的地址,就会出现问题。
4+
5+
K8S 使用 ConfigMap 来将你的配置数据和应用程序代码分开,将非机密性的数据保存到键值对中。ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1 MiB。如果你需要保存超出此尺寸限制的数据,你可能考虑挂载存储卷。
6+
7+
下面我们可以来看一个例子,我们修改之前代码,假设不同环境的数据库地址不同,下面代码从环境变量中获取 `DB_URL`,并将它返回。
8+
9+
```go
10+
package main
11+
12+
import (
13+
"fmt"
14+
"io"
15+
"net/http"
16+
"os"
17+
)
18+
19+
func hello(w http.ResponseWriter, r *http.Request) {
20+
host, _ := os.Hostname()
21+
dbURL := os.Getenv("DB_URL")
22+
io.WriteString(w, fmt.Sprintf("[v4] Hello, Kubernetes! From host: %s, Get Database Connect URL: %s", host, dbURL))
23+
}
24+
25+
func main() {
26+
http.HandleFunc("/", hello)
27+
http.ListenAndServe(":3000", nil)
28+
}
29+
```
30+
31+
构建 `hellok8s:v4` 的镜像,推送到远程仓库。并删除之前创建的所有资源。
32+
33+
```shell
34+
docker build . -t guangzhengli/hellok8s:v4
35+
docker push guangzhengli/hellok8s:v4
36+
37+
kubectl delete deployment,service,ingress --all
38+
```
39+
40+
接下来创建不同 namespace 的 configmap 来存放 `DB_URL`
41+
42+
创建 `hellok8s-config-dev.yaml` 文件
43+
44+
```yaml
45+
apiVersion: v1
46+
kind: ConfigMap
47+
metadata:
48+
name: hellok8s-config
49+
data:
50+
DB_URL: "http://DB_ADDRESS_DEV"
51+
```
52+
53+
创建 `hellok8s-config-test.yaml` 文件
54+
55+
```yaml
56+
apiVersion: v1
57+
kind: ConfigMap
58+
metadata:
59+
name: hellok8s-config
60+
data:
61+
DB_URL: "http://DB_ADDRESS_TEST"
62+
```
63+
64+
分别在 `dev` `test` 两个 namespace 下创建相同的 `ConfigMap`,名字都叫 hellok8s-config,但是存放的 Pair 对中 Value 值不一样。
65+
66+
```shell
67+
kubectl apply -f hellok8s-config-dev.yaml -n dev
68+
# configmap/hellok8s-config created
69+
70+
kubectl apply -f hellok8s-config-test.yaml -n test
71+
# configmap/hellok8s-config created
72+
73+
kubectl get configmap --all-namespaces
74+
NAMESPACE NAME DATA AGE
75+
dev hellok8s-config 1 3m12s
76+
test hellok8s-config 1 2m1s
77+
```
78+
79+
接着使用 POD 的方式来部署 `hellok8s:v4`,其中 `env.name` 表示的是将 configmap 中的值写进环境变量,这样代码从环境变量中获取 `DB_URL`,这个 KEY 名称必须保持一致。`valueFrom` 代表从哪里读取,`configMapKeyRef` 这里表示从名为 `hellok8s-config` 的 `configMap` 中读取 `KEY=DB_URL` 的 Value。
80+
81+
```yaml
82+
apiVersion: v1
83+
kind: Pod
84+
metadata:
85+
name: hellok8s-pod
86+
spec:
87+
containers:
88+
- name: hellok8s-container
89+
image: guangzhengli/hellok8s:v4
90+
env:
91+
- name: DB_URL
92+
valueFrom:
93+
configMapKeyRef:
94+
name: hellok8s-config
95+
key: DB_URL
96+
```
97+
98+
下面分别在 `dev` `test` 两个 namespace 下创建 `hellok8s:v4`,接着通过 `port-forward` 的方式访问不同 namespace 的服务,可以看到返回的 `Get Database Connect URL: http://DB_ADDRESS_TEST` 是不一样的!
99+
100+
```shell
101+
kubectl apply -f hellok8s.yaml -n dev
102+
# pod/hellok8s-pod created
103+
104+
kubectl apply -f hellok8s.yaml -n test
105+
# pod/hellok8s-pod created
106+
107+
kubectl port-forward hellok8s-pod 3000:3000 -n dev
108+
109+
curl http://localhost:3000
110+
# [v4] Hello, Kubernetes! From host: hellok8s-pod, Get Database Connect URL: http://DB_ADDRESS_DEV
111+
112+
kubectl port-forward hellok8s-pod 3000:3000 -n test
113+
114+
curl http://localhost:3000
115+
# [v4] Hello, Kubernetes! From host: hellok8s-pod, Get Database Connect URL: http://DB_ADDRESS_TEST
116+
```

doc/container.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
## Container
2+
3+
> Container (容器) 是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样,把你的应用“装”起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去。
4+
5+
我们来创建一个后续 k8s 教程需要的容器镜像,首先新建一个 `main.go` 的 golang 文件,里面写的是 `v1` 版本的代码,逻辑很简单,创建一个 `http server`,调用配置端口 `3000` 返回字符串 `[v1] Hello, Kubernetes!`
6+
7+
```go
8+
package main
9+
10+
import (
11+
"io"
12+
"net/http"
13+
)
14+
15+
func hello(w http.ResponseWriter, r *http.Request) {
16+
io.WriteString(w, "[v1] Hello, Kubernetes!")
17+
}
18+
19+
func main() {
20+
http.HandleFunc("/", hello)
21+
http.ListenAndServe(":3000", nil)
22+
}
23+
```
24+
25+
接下来我们编写 `Dockerfile` 文件,简单的方案当然是直接使用 golang 的 alpine 镜像来打包,但是因为我们后续练习需要频繁的 push image 到 dockerhub 和 pull image 到 kubernetes 中,为了优化网络速度,可以先在 `golang:1.16-buster` 中将上述代码编译成二进制文件,再将二进制文件复制到 `base-debian10` 镜像中运行。
26+
27+
这样我们可以将 300MB~500MB 大小的镜像变成只有 20MB 的镜像,甚至压缩上传到 DockerHub 后大小只有 10MB。
28+
29+
```dockerfile
30+
# Dockerfile
31+
FROM golang:1.16-buster AS builder
32+
RUN mkdir /src
33+
ADD . /src
34+
WORKDIR /src
35+
36+
RUN go env -w GO111MODULE=auto
37+
RUN go build -o main .
38+
39+
FROM gcr.io/distroless/base-debian10
40+
41+
WORKDIR /
42+
43+
COPY --from=builder /src/main /main
44+
EXPOSE 3000
45+
ENTRYPOINT ["/main"]
46+
```
47+
48+
执行 `docker build` 命令,第一次需要先 pull base images,需要耐心等待一会。
49+
50+
需要注意将 `guangzhengli` 替换成自己的 `DockerHub` 账号名称。 这样我们后续可以 push image 到我们自己的 `DockerHub` 仓库当中。
51+
52+
```shell
53+
docker build . -t guangzhengli/hellok8s:v1
54+
```
55+
56+
`docker build` 完成后我们可以通过 `docker images` 查看镜像基础信息,执行 `docker run` 命令将容器启动, `-p` 指定 `3000` 作为端口,`-d` 指定刚打包成功的镜像名称。
57+
58+
```shell
59+
docker run -p 3000:3000 --name hellok8s -d guangzhengli/hellok8s:v1
60+
```
61+
62+
运行成功后,可以通过浏览器或者 `curl` 来访问 `http://127.0.0.1:3000` , 查看是否成功返回字符串 `[v1] Hello, Kubernetes!`
63+
64+
这里因为我的 docker runtime 是使用 `minikube`,所以我需要先调用 `minikube ip` 来或者 IP 地址,例如这里返回了 `192.168.59.100`,所以我需要访问 `http://192.168.59.100:3000` 来判断是否成功返回字符串 `[v1] Hello, Kubernetes!`
65+
66+
```shell
67+
docker push guangzhengli/hellok8s:v1
68+
```
69+
70+
最后确认没有问题,`docker push` 将镜像上传到远程的 `DockerHub` 仓库当中,这样可以供他人下载使用,也方便后续 `Minikube` 下载镜像使用。

doc/dashboard.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
## Dashboard(TODO)
2+
3+
//TODO: 介绍 kubernetes dashboard
4+
5+
### K9s(TODO)
6+
7+
//TODO: 介绍 k9s client
8+
9+
![83ybd4](https://cdn.jsdelivr.net/gh/guangzhengli/PicURL@master/uPic/83ybd4.png)

0 commit comments

Comments
 (0)