K8s Intro

AI 摘要: 本文介绍了k8s的背景、基本概念以及安装使用方法。k8s是一个基础设施,提供了支持弹性分布式的系统框架/平台,能够自动化地管理容器化的工作负载和服务。它具有服务注册、发现、负载均衡、自动部署和回滚等功能。k8s不是PaaS,也不限制应用类型,不提供日志记录、监控、告警的解决方案,也不构建应用或部署源代码。在学习安装方面,需要安装kubectl和Hypervisor,并使用Minikube在虚拟机中运行单节点的Kubernetes集群。此外,文章还介绍了网络策略的概念和实现方式。

基本概念

k8s 背景,是什么,能做什么

  1. k8s 背景:硬件混部 APP,硬件多 VM 部署 APP,硬件容器化部署 APP。演变过程,资源隔离、利用率、复杂度不断提升。
  2. 容器优势:与基础架构分离(开发与运维分离,关注应用开发),支持移植性(跨平台),轻量级(支持快速 CI/CD),资源隔离(安全性、资源利用效率提升),复杂性提升
  3. k8s 是啥:
    • k8s 是一个基础设施,提供了支持弹性分布式的系统框架/平台,灵活、可移植和扩展的开源平台,基于声明式配置,自动化地管理容器化的工作负载和服务,支持部署、扩缩容、负载均衡、日志监控。
    • 由 Google14 年开源出来,结合了众多开源社区的思想,k8s 是 Kubernetes,希腊语的飞行员/舵手意思,与其 Logo 标识一致。
  4. k8s 做啥:提供了一个支持弹性分布式系统框架,满足自动部署、弹性扩容、故障转移、故障恢复,做到这些需要依赖以下功能提供:
    • 服务注册、发现,负载均衡支持,流量调度支持
    • 自动部署和回滚(自动部署和回滚应用容器)
    • 容器资源设定(CPU、内存)
    • 自我恢复(容器重启、替换,结合流量调度,对客户端无感知)
  5. k8s 不是:
    • k8s 不是 PaaS(Paas 包含众多服务,诸如中间件、存储、日志、搜索等,可以想象阿里云平台), 它仅提供 PaaS 的一些普世功能(部署、扩展、负载均衡、日志记录和监控)
    • k8s 不限制应类型,无论是有状态或无状态工作负载
    • k8s 不构建应用,也不部署源代码,这块是 CI/CD 工作,k8s 的调度或编排对象可以理解为服务容器
    • k8s 不提供日志记录、监控、告警的解决方案,只提供了一些这块方案的简要证明(理论支持)
    • k8s 不要求配置语言,它提供了 API 声明式操作
    • k8s 不提供也不采用任何全面的机器配置、维护、管理或自我修复系统
    • k8s 不仅仅只是一个编排系统,编排的技术定义为 A->B->C,而 k8s 是一个从 A->C 不断拟合的过程,连续地将当前状态驱动到所提供的所需状态,从 A 到 C 的方式无关紧要。
  6. k8s 生产环境考虑
    • 考虑哪些抽象层使用云平台的能力,哪些自己能力建设,Kubernetes 集群的一些抽象概念可能是`应用领域、数据平面、控制平面、集群基础架构、集群操作层面
      • 阿里巴巴、AWS EC2:Turnkey 云(只负责集群基础架构管理),其余的企业自行处理
      • 腾讯云:支持多种方式
    • 细节参考:https://kubernetes.io/zh/docs/setup/

学习安装

  1. 安装kubectl来管控 k8s 集群
  2. 安装Hypervisor,如VirtualBox,其他支持HyperKitVMware Fusion
  3. 安装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

  • 自主管理
  • 控制器管理
  1. pause 容器
  2. 同 pod 网络共享、存储卷共享

控制器类型

  • RC&RS&Deployment:
    • HPA: 基于资源利用率,水平扩展
  • Stateful 解决服务状态问题,服务状态问题
  • DaemonSet
    • fluented, logstash
    • Prometheus
  • Job

服务发现

Client=>服务

网络模型(- 扁平化管理)

  • 同 Pod 多容器:lo(pause)
  • 不同 Pod 间通讯:Overlay Network
  • Pod 与 Server 之间通讯:节点 Iptable 规则/LVS

Flannel:网络规划服务,集群各节点创建的 Docker 容器具有全局唯一虚拟 IP 地址 - ETCD:网段资源

物理网络:节点网络+虚拟网络:(Pod 网络+Service 网络)

安装

  • Harbor:镜像仓库
  • Router:

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
  • 元数据:
    • HPA
    • PodTemplete
    • LimitRange

资源清单

通过安装 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。