跳到主要内容

k8s

容器编排系统

  • 服务发现和负载均衡
  • 存储编排
  • 自动部署和回滚
  • 自动完成装箱计算
  • 自我修复
  • 密钥与配置管理
  • 批处理执行
  • 水平扩缩
  • IPv4/IPv6
  • 为可扩展设计

kubernetes Cluster = N Master Node + N Worker Node, N > 1

  • kubelet
  • kubectl, 命令行
  • kubeadm
    • kubeadm init
    • kubeadm join
  • scheduler
  • kube-proxy
  • kube-APIserver
  • etcd 键值数据库(Kube-apiserver 与 etcd 进行交互)
  • controller-manager
  • pod
  • 零宕机发布
  • 无状态服务 Deployment 概念
  • 云平台上创建 VPC 网络
  • HAproxy, keepalived 负载均衡器

k8s 安装(debian)

前提条件, 已安装 docker, 禁用交换分区 swap。

安装 kubeadm 的官方文档: https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

# 1. k8s 所需要的包
udo apt-get update
# apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

#2. 公共签名密钥
# 如果 `/etc/apt/keyrings` 目录不存在,则应在 curl 命令之前创建它,请阅读下面的注释。
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

#3. 添加 k8s 的 apt 仓库
# 此操作会覆盖 /etc/apt/sources.list.d/kubernetes.list 中现存的所有配置。
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

#4. 安装 kubeadm, kubectl, kubelet, 并锁定其版本
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

#5. 启用 kubelet 服务
sudo systemctl enable --now kubelet

minikube 安装

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
sudo dpkg -i minikube_latest_amd64.deb

# docker
minikube start --vm-driver docker --container-runtime=docker --force

k8s 集群安装

  1. 需要先安装 docker
  2. 关闭交换分区
  3. 安装 kubectl, kubeadm, kubelet https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux/
    • 下载 curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
    • 校验
      • curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
      • echo "$(cat kubectl.sha256) kubectl" | sha256sum --check
    • 安装
      • sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
      • kubectl version --client
      • kubectl version --client --output=yaml

kubeadm 安装

yaml 文件

  1. kubectl debug 设置一个临时容器。
  2. sidecar
  3. Volume 挂载, 可能需要更改目录权限(可能耗时会很长, 不推荐), fsGroup
  4. ConfigMap, secret: 配置文件

所有机器的时间要同步。 可以使用 ntpdate

提高进程可同时打开的文件数量上限, 避免 Too many open files 错误。

ulimit -SHn 65535
cat /etc/security/limits.conf
uname -a
kubeadm config images pull --config xxx.yaml
kubeadm init --config xxx.yaml --upload-certs
kubeadm reset

k8s 基本组件 安装

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# apt 仓库
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

kuboard for k8s 控制面板

k8s 组件

Master 组件是集群的控制平台 control plane

  • 全局决策
  • 探测并响应集群事件

Master 组件可以运行于集群中的任何机器上面。

通常的做法是在将所有的 master 组件运行在一台机器上,且不在这个机器上运行用户的容器。

kube-apiserver

  • 提供 k8s api
  • k8s 的前端,可以水平扩展

kubectl/k9s board/kuboard 就是通过 k8s api 实现的

etcd

支持一致性和高可用的名值对存储组件。

k8s 的所有配置信息都存储在 etcd 中。

kube-scheduler

此组件监控所有新创建尚未分配到节点上的 Pod,并且自动为 Pod 选择一个合适的节点去运行。

kube-controller-manager

此组件运行了所有的控制器

逻辑上来说,每一个控制器是一个独立的进程,但是为了降低复杂度,这些控制器都被合并运行在一个进程里。

  • 节点控制器
  • 副本控制器
  • 端点控制器
  • Service Account & Token 控制器

cloud-controller-manager

cloud-controller-manager 中运行了与具体云基础设施供应商互动的控制器。

cloud-controller-manager 只运行特定于云基础设施供应商的控制器。

Node 组件

Node 组件运行在每一个节点上(master 节点和 worker 节点), 负责维护运行中的 Pod 并提供 k8s 运行时环境。

kubelet

运行中每一个集群节点上的代理程序。

确保 Pod 中的容器处于运行状态。

kube-proxy

一个网络代理程序,运行在集群的每一个节点上。

kube-proxy 在节点上维护网络规则。这些网络规则使得您可以在集群内、集群外正确地与 Pod 进行网络通信。

容器引擎

容器引擎负责运行容器。

Addons

Deployment

在 k8s 中,通过发布 Deployment, 可以创建应用程序(docker image)的示例(docker container)。

这个实例被包含在成为 Pod 的概念中。

Pod 是 k8s 中最小可管理单元。

在 k8s 集群中发布 Deployment 后,Deployment 将指示 k8s 如何创建和更新应用程序的实例,master 节点将应用程序实例调度到集群中的具体的节点上。

创建实例后, k8s deployment controller 会持续监控这些实例。

minikube 与 k8s 的关系是什么?

k8s 是一个容器编排系统。

minikube 本质上是一个工具, 主要解决开发者在本地环境运行 k8s 集群的需求。

minikube 定位:

  • 本机环境解决方案
  • 实现原理:单节点虚拟机
  • 适用场景:开发测试

minikube 不是 k8s 的替代品,而是让开发者能在本地低成本体验 k8s 的工具。

minikube 官网: https://minikube.sigs.k8s.io/docs/

minikube start \
--driver=docker \
--force \
--image-mirror-country=cn \
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers

Pod

任务分为2种

  • 长期运行任务
  • 离线任务
    • 定时任务 CronJob
    • 临时任务 Job

配置信息分为 2 种

  • 明文 ConfigMap
  • 保密信息 Secret
    • 私有镜像仓库的认证信息 docker-registry
    • 身份识别的凭证信息
    • HTTPS 证书和密钥 tls
    • 一般机密信息 generic
#  kubectl create secret --help
Available Commands:
docker-registry Create a secret for use with a Docker registry
generic Create a secret from a local file, directory, or literal value
tls Create a TLS secret

kubeadm

  1. k8s 使用主机 hostname 来区分节点,因此不能重名
hostnamectl set-hostname master
  1. 使用 Docker 作为 k8s 的底层支持

docker 安装文档: https://docs.docker.com/desktop/setup/install/linux/debian/

配置 mirror

cat <<EOF | sudo tee /etc/docker/daemon.json
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://k061b8gm.mirror.aliyuncs.com"
]
}
EOF

sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker
  1. 修改 iptables 配置,启用 br_netfilter 模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
EOF

sudo sysctl --system
  1. 禁用 swap 分区
sudo swapoff -a
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab

--pod-network-cidr 设置 pod 的 ip 地址段 --apiserver-advertise-address apiserver 的 ip 地址 --kubernetes-version 指定 k8s 版本号

kubeadm init \
--pod-network-cidr=10.10.0.0/16 \
--apiserver-advertise-address=192.168.10.210 \
--kubernetes-version=v1.35
kubeadm join 192.168.10.210:6443 --token xxx \
--discovery-token-ca-cert-hash sha256:xxx