part1 云原生
part2 容器化
说明:
1. FROM 行表示以下的构建步骤基于什么镜像进行构建,正如前面所提到的,镜像是可以复用的;
2. WORKDIR 行表示会把接下来的构建步骤都在哪一个相应的具体目录下进行,其起到的作用类似于 Shell 里面的 cd; (进入一个目录)
3. COPY 行表示的是可以将宿主机上的文件拷贝到容器镜像内;
4. RUN 行表示在具体的文件系统内执行相应的动作。当我们运行完毕之后就可以得到一个应了;
5. CMD 行表示使用镜像时的默认程序名字。(默认的运行应用名称)
数据卷管理主要有两种方式:
-
第一种是通过 bind 的方式,直接将宿主机的目录直接挂载到容器内;这种方式比较简单,但是会带来运维成本,因为其依赖于宿主机的目录,需要对于所有的宿主机进行统一管理。
-
第二种是将目录管理交给运行引擎。
part3 k8s
学习 Kubernetes 需要掌握一系列基础概念和技术。以下是一份学习 Kubernetes 的主要内容:
1. 基础概念和术语:
Pods(Pod): Kubernetes 最小的可部署单元,可以包含一个或多个容器。
Service: 提供对一组 Pod 的访问、负载均衡和服务发现。
Deployment: 用于定义和管理 Pod 的部署,支持滚动更新。
ConfigMaps 和 Secrets: 用于管理应用程序的配置和敏感信息。
Namespace: 用于在集群中创建虚拟的资源分区。
Node 和 Cluster: Node 是集群中的工作节点,Cluster 是由一组 Node 组成的整体。
2. Kubernetes 架构和组件:
Master 和 Node: Kubernetes 集群的两个核心组件,Master 负责集群的控制和管理,Node 执行容器工作负载。
etcd: 分布式键值存储,用于保存集群状态。
kubelet 和 kube-proxy: Node 上的代理程序,负责维护容器的运行状态和网络代理。
API Server: 提供 Kubernetes 控制面板的 API 入口。
Controller Manager 和 Scheduler: 控制器负责监控集群状态和进行调整,调度器负责将 Pod 分配到 Node 上。
3. Pod 和容器:
Docker 或其他容器运行时: 了解容器技术,学习如何构建、推送和运行容器。
Pod 的生命周期: 了解 Pod 的创建、调度、运行和销毁过程。
4. Kubectl 工具:
kubectl: Kubernetes 命令行工具,用于与集群进行交互。
kubectl 的基本命令: 学习使用 kubectl 进行 Pod、Service、Deployment 等资源的管理和查询。
5. Pod 网络和服务发现:
Service 和 Ingress: 学习如何创建 Service 和使用 Ingress 控制对应用程序的访问。
Flannel、Calico 或其他网络插件: 了解 Pod 之间的网络通信和服务发现机制。
6. 存储:
Volume: 学习如何在 Pod 中使用 Volume 进行数据持久化。
Persistent Volumes 和 Persistent Volume Claims: 理解如何管理持久化存储。
7. 配置管理:
ConfigMaps 和 Secrets: 了解如何使用 ConfigMaps 和 Secrets 管理应用程序配置和敏感信息。
8. 安全:
RBAC(Role-Based Access Control): 学习如何使用 RBAC 控制用户对集群的访问权限。
Network Policies: 了解如何定义和实施网络策略,控制 Pod 之间的通信。
9. 监控和日志:
Prometheus 或其他监控工具: 学习如何监控集群中的资源利用率和应用程序性能。
EFK Stack(Elasticsearch、Fluentd、Kibana): 了解如何收集和分析日志。
10. 扩展和自动化:
Horizontal Pod Autoscaler(HPA): 学习如何根据负载自动调整 Pod 的数量。
Operator 模式: 了解如何使用 Operator 实现自定义控制器。
11. 实际应用和部署:
实践项目: 尝试在本地或云上搭建一个简单的 Kubernetes 集群,部署和管理一个简单的应用程序。
12. 进阶主题:
Service Mesh(例如 Istio): 了解如何使用服务网格管理微服务之间的通信。
Kustomize: 学习如何使用 Kustomize 进行 Kubernetes 资源的声明式管理。
13. 持续集成和持续部署:
Jenkins、GitLab CI 等工具: 学习如何使用 CI/CD 工具将应用程序部署到 Kubernetes 集群。
14. 社区和文档:
Kubernetes 官方文档: 详细阅读 Kubernetes 官方文档,了解最新的更新和最佳实践。
参与社区: 加入 Kubernetes 社区,参与讨论、贡献和学习。
以上是一个涵盖 Kubernetes 学习的基础和进阶主题的列表。建议在学习过程中结合实际应用场景,通过动手操作和构建项目来加深理解。同时,随着 Kubernetes 技术的不断演进,持续关注社区的更新和最佳实践。
part4 k8s命令指南
Kubectl 自动补全
# setup autocomplete in bash, bash-completion package should be installed first.
$ source <(kubectl completion bash)
# setup autocomplete in zsh
$ source <(kubectl completion zsh)
Kubectl 上下文和配置
设置 kubectl 命令交互的 kubernetes 集群并修改配置信息。参阅 使用 kubeconfig 文件进行跨集群验证 获取关于配置文件的详细信息。
# 显示合并后的 kubeconfig 配置
$ kubectl config view
# 同时使用多个 kubeconfig 文件并查看合并后的配置
$ KUBECONFIG=~/.kube/config:~/.kube/kubconfig2 kubectl config view
# 获取 e2e 用户的密码
$ kubectl config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}'
# 显示当前的上下文
$ kubectl config current-context
# 设置默认上下文为 my-cluster-name
$ kubectl config use-context my-cluster-name
# 向 kubeconf 中增加支持基本认证的新集群
$ kubectl config set-credentials kubeuser/foo.kubernetes.com --username=kubeuser --password=kubepassword
# 使用指定的用户名和 namespace 设置上下文
$ kubectl config set-context gce --user=cluster-admin --namespace=foo \
&& kubectl config use-context gce
1、创建对象
Kubernetes 的清单文件可以使用 json 或 yaml 格式定义。可以以 .yaml、.yml、或者 .json 为扩展名。
# 创建资源
$ kubectl create -f ./my-manifest.yaml
# 使用多个文件创建资源
$ kubectl create -f ./my1.yaml -f ./my2.yaml
# 使用目录下的所有清单文件来创建资源
$ kubectl create -f ./dir
# 使用 url 来创建资源
$ kubectl create -f https://git.io/vPieo
# 启动一个 nginx 实例
$ kubectl run nginx --image=nginx
# 获取 pod 和 svc 的文档
$ kubectl explain pods,svc
# 从 stdin 输入中创建多个 YAML 对象
$ cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
name: busybox-sleep
spec:
containers:
- name: busybox
image: busybox
args:
- sleep
- "1000000"
---
apiVersion: v1
kind: Pod
metadata:
name: busybox-sleep-less
spec:
containers:
- name: busybox
image: busybox
args:
- sleep
- "1000"
EOF
# 创建包含几个 key 的 Secret
$ cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: $(echo "s33msi4" | base64)
username: $(echo "jane" | base64)
EOF
-
查看 Pod,现在没有任何的一个 Pod;
-
kubectl get pods
-
然后用事先准备好的一个 Pod 的 yaml,创建一个 Pod 出来;
-
kubectl apply -f pod1.yaml
-
kubectl apply -f pod2.yaml
-
现在查看一下 Pod 打的标签,我们用 --show-labels 这个选项,可以看到这两个 Pod 都打上了一个部署环境和层级的标签;
-
kubectl get pods —show-labels
-
我们也可以通过另外一种方式来查看具体的资源信息。首先查看 nginx1 第一个 Pod 的一个信息,用 -o yaml 的方式输出,可以看到这个 Pod 元数据里面包括了一个 lables 的字段,里面有两个 lable;
-
kubectl get pods nginx1 -o yaml | less
-
现在再想一下,怎么样对 Pod 已有的 lable 进行修改?我们先把它的部署环境,从开发环境改成测试环境,然后指定 Pod 名字,在环境再加上它的一个值 test ,看一下能不能成功。 这里报了一个错误,可以看到,它其实是说现在这个 label 已经有值了;
-
kubectl label pods nginx1 env=test
-
如果想覆盖掉它的话,得额外再加上一个覆盖的选项。加上之后呢,我们应该可以看到这个打标已经成功了;
-
kubectl label pods nginx1 env=test —overwrite
-
我们再看一下现在集群的 lable 设置情况,首先可以看到 nginx1 的确已经加上了一个部署环境 test 标签;
-
kubectl get pods —show-labels
-
如果想要对 Pod 去掉一个标签,也是跟打标签一样的操作,但是 env 后就不是等号了。只加上 label 名字,后面不加等号,改成用减号表示去除 label 的 k:v;
-
kubectl label pods nginx tie-
-
可以看到这个 label,去标已经完全成功;
-
kubectl get pods —show-labels
-
下面来看一下配置的 label 值,的确能看到 nginx1 的这个 Pod 少了一个 tie=front 的标签。有了这个 Pod 标签之后,可以看一下怎样用 label Selector 进行匹配?首先 label Selector 是通过 -l 这个选项来进行指定的 ,指定的时候,先试一下用相等型的一个 label 来筛选,所以我们指定的是部署环境等于测试的一个 Pod,我们可以看到能够筛选出一台;
-
kubectl get pods —show-labels -l env=test
-
假如说有多个相等的条件需要指定的,实际上这是一个与的关系,假如说 env 再等于 dev,我们实际上是一个 Pod 都拿不到的;
-
kubectl get pods —show-labels -l env=test,env=dev
-
然后假如说 env=dev,但是 tie=front,我们能够匹配到第二个 Pod,也就是 nginx2;
-
kubectl get pods —show-labels -l env=dev,tie=front
-
我们还可以再试一下怎么样用集合型的 label Selector 来进行筛选。这一次我们还是想要匹配出所有部署环境是 test 或者是 dev 的一个 Pod,所以在这里加上一个引号,然后在括号里面指定所有部署环境的一个集合。这次能把两个创建的 Pod 都筛选出来;
-
kubectl get pods —show-labels -l ’env in (dev,test)’
-
我们再试一下怎样对 Pod 增加一个注解,注解的话,跟打标是一样的操作,但是把 label 命令改成 annotate 命令;然后,一样指定类型和对应的名字。后面就不是加上 label 的 k:v 了,而是加上 annotation 的 k:v。这里我们可以指定一个任意的字符串,比如说加上空格、加上逗号都可以;
-
kubectl annotate pods nginx1 my-annotate=‘my annotate,ok’
-
然后,我们再看一下这个 Pod 的一些元数据,我们这边能够看到这个 Pod 的元数据里面 annotations,这是有一个 my-annotate 这个 Annotations;
-
kubectl get pods nging1 -o yaml | less
-
然后我们再演示一下看 Pod 的 OwnerReference 是怎么出来的。原来的 Pod 都是直接通过创建 Pod 这个资源方式来创建的,这次换一种方式来创建:通过创建一个 ReplicaSet 对象来创建 Pod 。首先创建一个 ReplicaSet 对象,这个 ReplicaSet 对象可以具体查看一下;
-
kubectl apply -f rs.yaml
-
kubectl get replicasets nginx-replicasets -o yaml |less
-
会发现多了两个 Pod,仔细查看这两个 Pod,可以看到 ReplicaSet 创建出来的 Pod 有一个特点,即它会带有 OwnerReference,然后 OwnerReference 里面指向了是一个 replicasets 类型,名字就叫做 nginx-replicasets
-
kubectl get pods nginx-replicasets-rhd68 -o yaml | less
常用devevops工具链: