打开/关闭搜索
搜索
打开/关闭菜单
66
939
81
2766
md5.pw
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
上传文件
打开/关闭外观设置菜单
通知
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。
user-interface-preferences
个人工具
登录
请求账号
查看“︁如何搭建 Kubernetes 一站式平台”︁的源代码
来自md5.pw
分享此页面
更多语言
查看
阅读
查看源代码
查看历史
associated-pages
页面
讨论
更多操作
←
如何搭建 Kubernetes 一站式平台
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
---- == '''1. 什么是 Kubernetes / k8s''' == k8s 也就是 Kubernetes 是一个面向容器化应用的自动化管理平台, 核心职责是管理程序运行的环境, 包括 <code>部署应用/调度资源/维护副本/处理故障/对外暴露服务</code>等等... 对于初学者来说可以把它理解成一个专门管理容器集群的平台, 当你只有一个容器时也许还感觉不到它的必要性 但当你需要同时运行多个服务, 需要让服务彼此通信, 需要保证应用异常后自动恢复, 甚至需要后续扩容到多台机器时 Kubernetes 的价值就会非常明显 而本文要做的事情, 就是在一台主机上先搭建一个最小可运行的 Kubernetes 环境, 借助这个过程去理解 Kubernetes 是怎样从零开始被组织起来的 为了易读性, 在这里会将 <code>Kubernetes</code> 简称为 <code>k8s</code> == '''2. 环境说明''' == 运行 kubeadm 集群建议 control plane 节点至少具备 <code>2 Core CPU</code> 和 <code>2 GiB</code> 运存, 推荐购买搬瓦工的 [https://bandwagonhost.com/cart.php?a=add&pid=166 ECOMMERCE SLA] 套餐 * 操作系统以 Debian13 为例 * 主机数量 1 台 * 使用 root 用户 * 主机承担 control plane 和 workload 调度 * k8s pod网段为 <code>10.10.0.0/16</code> , service网段为 <code>192.168.0.0/16</code> * 使用 <code>Headlamp</code> 管理k8s pods == '''3. 前置准备''' == ==== 3.1 加载模块并启用转发 ==== <syntaxhighlight lang="bash"> cat <<'EOF' | tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF modprobe overlay modprobe br_netfilter cat <<'EOF' | tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 net.ipv6.conf.all.forwarding = 1 EOF sysctl --system </syntaxhighlight> ==== 3.2 配置 hosts ==== <syntaxhighlight lang="bash"> tee -a /etc/hosts > /dev/null <<'EOF' 127.0.0.1 k8s-master EOF </syntaxhighlight> ==== 3.3 关闭 swap (可选) ==== <syntaxhighlight lang="bash"> swapoff -a sed -ri '/\sswap\s/s/^/#/' /etc/fstab </syntaxhighlight> == '''4. 安装 containerd''' == 更新软件源并安装 containerd 与 其他核心组件<syntaxhighlight lang="bash"> apt update apt install -y containerd apt-transport-https ca-certificates curl gpg </syntaxhighlight>生成默认配置文件并修改配置文件, 这里为了防止后续可能报错, 修改了 <code>bin_dir</code><syntaxhighlight lang="bash">mkdir -p /etc/containerd containerd config default | tee /etc/containerd/config.toml > /dev/null sed -i 's#bin_dir = "/usr/lib/cni"#bin_dir = "/opt/cni/bin"#' /etc/containerd/config.toml sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml</syntaxhighlight>重启并设置自启<syntaxhighlight lang="bash"> systemctl daemon-reload systemctl restart containerd systemctl enable containerd systemctl status containerd </syntaxhighlight> == 5. 安装 kubeadm kubelet kubectl == <syntaxhighlight lang="bash"> mkdir -p -m 755 /etc/apt/keyrings curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /' | tee /etc/apt/sources.list.d/kubernetes.list apt-get update apt-get install -y kubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl systemctl enable --now kubelet </syntaxhighlight>检查<syntaxhighlight lang="bash"> kubeadm version kubectl version --client kubelet --version </syntaxhighlight> == '''6. 初始化单节点 k8s 集群''' == 新建一个初始化配置<syntaxhighlight lang="bash">mkdir -p /main/k8s nano /main/k8s/kubeadm-config.yaml</syntaxhighlight>粘贴并自行修改配置后进行保存<syntaxhighlight lang="yaml" line="1"> apiVersion: kubeadm.k8s.io/v1beta4 kind: InitConfiguration nodeRegistration: name: master criSocket: "unix:///run/containerd/containerd.sock" localAPIEndpoint: advertiseAddress: <你的公网主机IP> bindPort: 6443 --- apiVersion: kubeadm.k8s.io/v1beta4 kind: ClusterConfiguration kubernetesVersion: v1.35.0 networking: podSubnet: 10.10.0.0/16 serviceSubnet: 192.168.0.0/16 dnsDomain: cluster.local # 若开启了Swap需要解除此注释! #--- #apiVersion: kubelet.config.k8s.io/v1beta1 #kind: KubeletConfiguration #cgroupDriver: systemd #failSwapOn: false #memorySwap: # swapBehavior: LimitedSwap </syntaxhighlight>开始初始化<syntaxhighlight lang="bash"> kubeadm init --config /main/k8s/kubeadm-config.yaml </syntaxhighlight>初始化完成后配置 kubectl<syntaxhighlight lang="bash"> mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown "$(id -u)":"$(id -g)" $HOME/.kube/config </syntaxhighlight>检查<syntaxhighlight lang="bash">kubectl get nodes kubectl get pods -A</syntaxhighlight>这时 master 大概率是 <code>NotReady</code> 状态, 目前 CNI 还没有安装, CoreDNS 也通常不会处于 <code>Running</code> 状态 == '''7. 安装 Helm并设置补全''' == 安装 Helm<syntaxhighlight lang="bash">curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4 chmod 700 get_helm.sh ./get_helm.sh helm version</syntaxhighlight> ===== '''命令补全:''' ===== * zsh<syntaxhighlight lang="bash"> echo 'source <(kubectl completion zsh)' >> ~/.zshrc echo 'source <(helm completion zsh)' >> ~/.zshrc source ~/.zshrc </syntaxhighlight> * bash<syntaxhighlight lang="bash"> echo 'source <(kubectl completion bash)' >> ~/.bashrc echo 'source <(helm completion bash)' >> ~/.bashrc source ~/.bashrc </syntaxhighlight> * fish<syntaxhighlight lang="bash"> kubectl completion fish | sudo tee /etc/fish/completions/kubectl.fish > /dev/null helm completion fish | sudo tee /etc/fish/completions/helm.fish > /dev/null </syntaxhighlight> == 8. 安装 CNI 插件 == 在资源紧凑的主机中我更推荐使用 <code>Flannel</code> , 这里也会提供 <code>Calico</code> 与 <code>Cilium</code> 的安装, 根据应用场景自行选择其一 资源占用: <code>Flannel</code> < <code>Calico</code> < <code>Cilium</code> ==== 8.1 Flannel ==== <syntaxhighlight lang="bash">kubectl create namespace kube-flannel kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/enforce=privileged kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/audit=privileged kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/warn=privileged helm upgrade --install flannel -n kube-flannel --create-namespace --set podCidr=10.10.0.0/16 https://github.com/flannel-io/flannel/releases/download/v0.28.1/flannel.tgz</syntaxhighlight> ==== 8.2 Calico ==== <syntaxhighlight lang="bash">helm repo add projectcalico https://docs.tigera.io/calico/charts helm repo update kubectl create namespace tigera-operator helm upgrade --install calico projectcalico/tigera-operator --version v3.31.4 --namespace tigera-operator --set installation.calicoNetwork.ipPools[0].cidr=10.10.0.0/16 --set installation.calicoNetwork.ipPools[0].encapsulation=VXLAN</syntaxhighlight> ==== 8.3 Cilium ==== <syntaxhighlight lang="bash"> helm repo add cilium https://helm.cilium.io/ helm repo update helm upgrade --install cilium cilium/cilium --version 1.19.1 --namespace kube-system </syntaxhighlight>'''检查CNI'''<syntaxhighlight lang="bash"> kubectl get nodes kubectl get pods -A </syntaxhighlight>节点状态从 <code>NotReady</code> 变为 <code>Ready</code> , CoreDNS 进入 <code>Running</code> 状态, '''至此, k8s 已经初步部署完成''' == '''9. Headlamp (可选)''' == ==== 9.1 什么是 '''<code>Headlamp</code>''' ==== Headlamp是一个面向 k8s 的图形化管理界面, 它的目标是用更直观的方式帮助用户查看和管理集群资源, 例如节点/Pod/Deployment/Service/ConfigMap/Secret 等常见对象, 都可以通过 Web 页面进行浏览和操作 它定义为一个易用且可扩展的 Kubernetes WebUI 并强调它既可以作为集群内 Web 应用运行, 也可以作为桌面应用使用, 和很多传统 Dashboard 相比 Headlamp 的特点主要有三点: # 界面更现代 更偏向日常运维与开发使用 # 它支持基于 Kubernetes RBAC 的权限控制 用户能看到和操作的资源会自动受当前权限约束 # 它具备插件扩展能力 可以根据团队需求定制界面和功能 我个人认为可以帮助初学者摆脱只看命令行输出的方式, 更直观地观察集群中资源的创建/状态变化/日志/配置情况, 因此很适合作为 k8s 学习和演示环境中的可视化入口. ==== 9.2 开始安装 ==== 先新建一个 <code>values.yml</code> 文件<syntaxhighlight> mkdir -p /main/k8s/headlamp nano /main/k8s/headlamp/values.yml </syntaxhighlight>粘贴并自行修改配置后进行保存<syntaxhighlight lang="yaml" line="1"> replicaCount: 1 image: registry: ghcr.io repository: headlamp-k8s/headlamp tag: "" pullPolicy: IfNotPresent nameOverride: "" fullnameOverride: "headlamp" namespaceOverride: "" service: type: NodePort port: 80 # 宿主机开放端口 nodePort: 30080 env: - name: TZ value: "Asia/Shanghai" config: pluginsDir: /headlamp/plugins volumes: - name: plugins-volume hostPath: path: /main/k8s/headlamp/plugins type: DirectoryOrCreate volumeMounts: - name: plugins-volume mountPath: /headlamp/plugins resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 512Mi </syntaxhighlight>用 Helm 安装<syntaxhighlight lang="bash"> helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/ helm repo update helm upgrade --install headlamp headlamp/headlamp -n headlamp --create-namespace -f /main/k8s/headlamp/values.yml </syntaxhighlight>通过开放的端口访问到 Headlamp, 初次加载需要等待一会, 之后需要输入 <code>token</code>, 使用命令生成<syntaxhighlight lang="bash"> kubectl create token headlamp --namespace headlamp --duration 168h </syntaxhighlight>若不通则进行检查<syntaxhighlight lang="bash"> kubectl get nodes kubectl get pods -A </syntaxhighlight> ==== 9.3 查看资源使用概览 ==== Headlamp中各种资源显示, 需要依赖 <code>metrics-server</code><syntaxhighlight lang="bash"> helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/ helm repo update helm upgrade --install metrics-server metrics-server/metrics-server -n kube-system --set "args[0]=--kubelet-insecure-tls" </syntaxhighlight>安装好后就可以正常显示资源占用情况
返回
如何搭建 Kubernetes 一站式平台
。
查看“︁如何搭建 Kubernetes 一站式平台”︁的源代码
来自md5.pw