基本概念
k8s 背景,是什么,能做什么
- k8s 背景:硬件混部 APP,硬件多 VM 部署 APP,硬件容器化部署 APP。演变过程,资源隔离、利用率、复杂度不断提升。
- 容器优势:与基础架构分离(开发与运维分离,关注应用开发),支持移植性(跨平台),轻量级(支持快速 CI/CD),资源隔离(安全性、资源利用效率提升),复杂性提升
- k8s 是啥:
- k8s 是一个基础设施,提供了支持弹性分布式的系统框架/平台,灵活、可移植和扩展的开源平台,基于声明式配置,自动化地管理容器化的工作负载和服务,支持部署、扩缩容、负载均衡、日志监控。
- 由 Google14 年开源出来,结合了众多开源社区的思想,k8s 是 Kubernetes,希腊语的飞行员/舵手意思,与其 Logo 标识一致。
- k8s 做啥:提供了一个支持弹性分布式系统框架,满足自动部署、弹性扩容、故障转移、故障恢复,做到这些需要依赖以下功能提供:
- 服务注册、发现,负载均衡支持,流量调度支持
- 自动部署和回滚(自动部署和回滚应用容器)
- 容器资源设定(CPU、内存)
- 自我恢复(容器重启、替换,结合流量调度,对客户端无感知)
- k8s 不是:
- k8s 不是 PaaS(Paas 包含众多服务,诸如中间件、存储、日志、搜索等,可以想象阿里云平台), 它仅提供 PaaS 的一些普世功能(部署、扩展、负载均衡、日志记录和监控)
- k8s 不限制应类型,无论是有状态或无状态工作负载
- k8s 不构建应用,也不部署源代码,这块是 CI/CD 工作,k8s 的调度或编排对象可以理解为服务容器
- k8s 不提供日志记录、监控、告警的解决方案,只提供了一些这块方案的简要证明(理论支持)
- k8s 不要求配置语言,它提供了 API 声明式操作
- k8s 不提供也不采用任何全面的机器配置、维护、管理或自我修复系统
- k8s 不仅仅只是一个编排系统,编排的技术定义为 A->B->C,而 k8s 是一个从 A->C 不断拟合的过程,连续地将当前状态驱动到所提供的所需状态,从 A 到 C 的方式无关紧要。
- k8s 生产环境考虑
- 考虑哪些抽象层使用云平台的能力,哪些自己能力建设,Kubernetes 集群的一些抽象概念可能是`应用领域、数据平面、控制平面、集群基础架构、集群操作层面
- 阿里巴巴、AWS EC2:Turnkey 云(只负责集群基础架构管理),其余的企业自行处理
- 腾讯云:支持多种方式
- 细节参考:https://kubernetes.io/zh/docs/setup/
学习安装
- 安装
kubectl
来管控 k8s 集群 - 安装
Hypervisor
,如VirtualBox
,其他支持HyperKit
、VMware Fusion
- 安装
Minikube
在虚拟机中运行一个单节点的Kubernetes集群
安装 kubectl [^kubectl install]
通过命令行工具kubectl
部署和管理应用程序,比如检查集群资源,创建、删除和更新组件,查看您新集群,并启动实例应用程序。
必须使用与集群小版本号差别为 1 的kubectl
,使用新版本的kubectl
避免版本带来的兼容性问题。例1.2kubectl
版本的客户端应该与1.1版k8s集群
配套。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| // Mac
brew install kubernetes-cli
kubectl version
// Centos
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubectl
|
安装 Minikube [^minikube install]
Minikube
支持特性:
- DNS
- NodePorts
- ConfigMaps 和 Secrets
- Dashboards
- 容器运行时: Docker、CRI-O 以及 containerd
- 启用容器网络接口(CNI)
- Ingress(入口)
Pod 的概念,英文单词就是豌豆荚(范围包裹),里面含有很多豆子(容器)
1
2
3
4
5
| // Mac支持情况, VMX表示支持VT-x(虚拟化)特性
sysctl -a | grep -E --color 'machdep.cpu.features|VMX'
// Mac启动
brew install minikube
|
通过 Minikube 启动集群
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| // 集群启动
$ minikube start --vm-driver=virtualbox
🎉 minikube 1.9.1 is available! Download it: https://github.com/kubernetes/minikube/releases/tag/v1.9.1
💡 To disable this notice, run: 'minikube config set WantUpdateNotification false'
🙄 Darwin 10.15.3 上的 minikube v1.9.0
✨ 根据用户配置使用 virtualbox 驱动程序
💿 正在下载 VM boot image...
> minikube-v1.9.0.iso.sha256: 65 B / 65 B [--------------] 100.00% ? p/s 0s
> minikube-v1.9.0.iso: 174.93 MiB / 174.93 MiB 100.00% 344.46 KiB p/s 8m40
💾 Downloading Kubernetes v1.18.0 preload ...
> preloaded-images-k8s-v2-v1.18.0-docker-overlay2-amd64.tar.lz4: 542.91 MiB
🔥 Creating virtualbox VM (CPUs=2, Memory=4000MB, Disk=20000MB) ...
🐳 正在 Docker 19.03.8 中准备 Kubernetes v1.18.0…
🌟 Enabling addons: default-storageclass, storage-provisioner
🏄 完成!kubectl 已经配置至 "minikube"
|
通过 Minikube 管理集群
启动集群还有很多功能支持,可以通过minikube start --help
来查看更多:
- 指定 K8s 的版本
- 指定 web proxy:``
- 指定 vm 驱动:
--vm-driver
- 配置额外组件,可以使用多个不同的值多次传,也可以通过
kubectl动态配置
:--extra-config=apiserver.authorization-mode=RBAC --extra-config=kubelet.MaxPods=5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| // 显示 kubernetes service URL,可以基于浏览器打开
$ minikube service hello-minikube --url
// URL通过浏览器或者curl打开的展示的一些内容包含Pod的相关信息
Hostname:
Pod Information:
Server values:
Request Information:
Request Headers:
Request Body:
// 仪表盘
minikube dashboard
// 获取服务地址
minikube service [-n NAMESPACE] [--url] NAME
// 网络相关
minikube ip
// 停止集群
minikube stop
// 删除集群
minikube delete
|
通过 kubectl 与集群交互
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| // 安装完后,可以使用kubectl与集群进行交互,image镜像是一个简单的HTTP服务,在8080端口上
$ kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.10 --port=8080
// 将资源作为新的Kubernetes服务公开
// 要访问hello-minikube Deployment,需要将其作为Service公开,选项 --type=NodePort 指定Service的类型。
// 可以通过kubectl expose --help查看更多
$ kubectl expose deployment hello-minikube --type=NodePort
// 现在hello-minikube Pod 已经启动,但是您必须等到 Pod 启动完全才能通过暴露的 Service 访问它,可以通过kubectl查看Pod状态,为Ready则表示OK了
$ kubectl get pod
// 删除服务和部署
$ kubectl delete services hello-minikube
$ kubectl delete deployment hello-minikube
|
通过别的容器运行时启动Minikube
集群
1
2
3
4
5
6
7
| minikube start \
--network-plugin=cni \
--enable-default-cni \
--extra-config=kubelet.container-runtime=remote \
--extra-config=kubelet.container-runtime-endpoint=unix:///run/containerd/containerd.sock \
--extra-config=kubelet.image-service-endpoint=unix:///run/containerd/containerd.sock \
--bootstrapper=kubeadm
|
通过重用Docker
守护进程使用本地镜像
当为 Kubernetes 使用单个 VM 时,重用 Minikube 的内置 Docker 守护程序非常有用。
重用内置守护程序意味着您不必在主机上构建 Docker 镜像仓库并将镜像推入其中。相反,您可以在与 Minikube 相同的 Docker 守护进程内部构建,这可以加速本地实验。
国内网络环境问题
1
2
3
4
| minikube start --registry-mirror=https://xx.mirror.aliyuncs.com \
--docker-env HTTP_PROXY= HTTPS_PROXY= NO_PROXY=192.168.10.4/24 \
--docker-env HTTP_PROXY=http://devnet-proxy.oa.com:8080 HTTPS_PROXY=http://devnet-proxy.oa.com:8080 NO_PROXY=192.168.10.4/24 \
--vm-driver=virtualbox
|
参考
kubectl install: https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-on-linux
minikube install: https://kubernetes.io/zh/docs/tasks/tools/install-minikube/
基本概念
- Pod:
- Pod 控制器,做 Pod 管理
- 网络模式(Pod 内和 Pod 之间)
资源清单:
- 资源:掌握资源清单语法
- Pod 和其生命周期
- Pod 控制器
- 服务发现
- 服务定义(一组容器)
- 负载均衡 RR
- 每个容器有内部 Ip
组件
Borg Master(3 以上的奇数节点)+Borglet
调度器/Paxos
- kubectl
- api server
- etcd:分布式 jianzhicuncRaft
API savers。所有服务访问统一入口。
控制器管理器。负责维持副本期望数目。
调度器。负责介绍任务。选择合适的节点进行分配任务。
CCD。负责持久化存储。直接跟容器引擎交互,实现容器的生命周期管理。
Kubelet: 跟都可以引擎进行交互,实现容器的生命周期管理
Kubelet ku
负责写入规则至 ip table IPS could be pause pause 负责写入规则这 ip table at us。
coredns: dns> a 记录
ingress: 7 层代理功能支持
fedeation: 跨集群管理
普鲁米修斯
ELK
Pod
- pause 容器
- 同 pod 网络共享、存储卷共享
控制器类型
- RC&RS&Deployment:
- Stateful 解决服务状态问题,服务状态问题
- DaemonSet
- fluented, logstash
- Prometheus
- Job
服务发现
Client=>服务
网络模型(- 扁平化管理)
- 同 Pod 多容器:lo(pause)
- 不同 Pod 间通讯:Overlay Network
- Pod 与 Server 之间通讯:节点 Iptable 规则/LVS
Flannel:网络规划服务,集群各节点创建的 Docker 容器具有全局唯一虚拟 IP 地址 - ETCD:网段资源
物理网络:节点网络+虚拟网络:(Pod 网络+Service 网络)
安装
kubeadm:
资源
资源类型
- 名称空间:kubectl get pod -n default
- 集群资源:role
- 元数据:HPA
资源抽象, 对象:实例后的资源
- 名称空间:
- 工作负载资源:Pod、RS、Deployment、StatefulSet、DaemonSet、Job、CronJob
- 服务发现&负载均衡:Service、Ingress
- 配置与存储资源:Volume 存卷、CSI
- 特殊类型的存储卷:ConfigMap、Secret、DownwardAPI
- 集群资源:
- namespace
- node
- role
- clusterrole
- rolebing
- clusterrolebinding
- 元数据:
资源清单
通过安装 kubeadm 来管理 k8s 集群
1
| kubeadm init --pod-network-cidr=10.0.0.0/16 --service-cidr=10.0.0.0/16 --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
|
Docker For Mac - kubectl.docker
kubectl 操作
kubeadm
1
2
3
4
5
6
7
8
9
10
11
| // 初始化
kubeadm init
// 重置
kubeadm reset
// 加入worker节点
kubeadm join 9.134.233.187:6443 --token 6muenp.lfszdd2jgv1t8e9y \
--discovery-token-ca-cert-hash sha256:b317e238680c460c4bd64ba483bfaa29c5d507dabf3b01b11ef3fd71277f434c
// kube配置
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
|
集群配置命令
1
2
3
| mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
|
kubectl get 命令
线上一个或多个资源,可以通过--selector
来做选择,除非传递了--all-namespaces
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| // 查看集群节点
kubectl get pods
// 查看节点更多详情,包括节点名称等
kubectl get pods -o wide
// List a single replication controller with specified NAME in ps output format.
kubectl get replicationcontroller web
// 获取deployments apps的v1版本,以json格式
kubectl get deployments.v1.apps -o json
// 查看指定pod,以json输出
kubectl get -o json pod web-pod-13je7
// yaml配置,以json输出
kubectl get -f pod.yaml -o json
// List resources from a directory with kustomization.yaml - e.g. dir/kustomization.yaml.
kubectl get -k dir/
// 仅查看指定pod的指定值
kubectl get -o template pod/web-pod-13je7 --template={{.status.phase}}
// List resource information in custom columns.
kubectl get pod test-pod -o custom-columns=CONTAINER:.spec.containers[0].name,IMAGE:.spec.containers[0]image
// 查看replication controllers 和 services
kubectl get rc,services
// List one or more resources by their type and names.
kubectl get rc/web service/frontend pods/web-pod-13je7
|
node 节点查看
1
2
3
4
5
6
7
8
9
10
11
| kubectl get nodes
// 查看某个节点详情
kubectl describe node master
// 检测节点上,系统Pod状态(po与pods一致,-o wide输出更多内容)
kubectl get pods -n k8smaster
kubectl get po -n k8smaster -o wide
// 检查CoreDNS Pod 是否 Running
kubectl get pods --all-namespaces
|
部署 pod 网络到机器
必须部署一个基于 Pod 网络插件的 容器网络接口 (CNI),以便 Pod 可以相互通信。 在安装网络之前,集群 DNS (CoreDNS) 将不会启动。
1
| kubectl apply -f [podnetwork].yaml
|
部署网络插件
1
2
3
4
5
6
| // 安装wave-net
sudo curl -L git.io/weave -o /usr/local/bin/weave
chmod +x /usr/local/bin/weave
weave launch
export CHECKPOINT_DISABLE=1
|
概念
网络策略(NetworkPolicy)是一种关于 Pod 间及与其他网络端点间所允许的通信规则的规范。
网络策略通过网络插件来实现。https://kubernetes.io/zh/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/
网络插件有几种类型:
- CNI 插件: 遵守 appc/CNI 规约,为互操作性设计
- Kubenet 插件:使用 bridge 和 host-local CNI 插件实现了基本的 cbr0。