2.1 | kubernetes: 在裸机 Linux 上安装 k8s 集群

在开始安装 k8s 必要的软件前,最理想的环境是能够自由访问外网,所以需要先准备好代理,这样在安装被墙软件、拉取被墙的镜像时方便很多,不用为这种意义不大的事情纠结。重命名系统名称hostnamectl set-hostname k8s-masterhostnamectl set-hostname k

在开始安装 k8s 必要的软件前,最理想的环境是能够自由访问外网,所以需要先准备好代理,这样在安装被墙软件、拉取被墙的镜像时方便很多,不用为这种意义不大的事情纠结。

基础系统:   Ubuntu Server 22.04 虚拟机软件:VMware Fusion 宿主机系统:macOS

重命名系统名称

hostnamectl set-hostname k8s-master
echo "127.0.0.1   $(hostname)" >> /etc/hosts

Ubuntu 22.04 必要软件安装

设置软件源

打开 /etc/apt/source.list,替换软件源为阿里云源,如下

cat << EOF | sudo tee /etc/apt/sources.list >/dev/null && sudo apt update 
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
EOF

更新软件源

sudo apt update && sudo apt upgrade -y

zsh

sudo apt install -y zsh
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

# zsh-syntax-highlighting 命令是否正确
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

# zsh-autosuggestions 根据命令历史推荐
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

修改 zsh 配置文件

sed -i '2s/# //g' ~/.zshrc
sed -i 's/ZSH_THEME=.*/ZSH_THEME=ys/g' ~/.zshrc
sed -i 's/plugins=(git)/plugins=(git zsh-syntax-highlighting zsh-autosuggestions)/' ~/.zshrc

基础软件

常用小工具

sudo apt install -y \
    apt-transport-https gnupg2 curl vim \
    htop tree neofetch tldr tig make cmake  \
    golang-go nodejs

网络工具

sudo apt install -y \
    net-tools bridge-utils iputils-ping iproute2 \
    netcat telnet traceroute

sudo 免输入密码

sudo update-alternatives --config editor
sudo visudo

修改配置如下

%sudo   ALL=(ALL:ALL) NOPASSWD:ALL

或直接运行下面的命令

sudo sed -i '50s/ALL$/NOPASSWD:ALL/g' /etc/sudoers

Docker

配置 Docker 软件源

sudo apt install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装 Docker 及 containerd

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

配置 Docker:/etc/docker/daemon.json

cat <<EOF | sudo tee /etc/docker/daemon.json >/dev/null
{
    "registry-mirrors": [
        "https://registry.docker-cn.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://hub-mirror.c.163.com",
        "https://reg-mirror.qiniu.com"
    ],
    "exec-opts": [
        "native.cgroupdriver=systemd"
    ]
}
EOF

普通用户使用 docker 命令 (可尝试 logout 后再 login)

sudo usermod -aG docker $USER

开启 TCP 访问

sudo sed -i '/^ExecStart=/s#$# -H tcp://0.0.0.0:2375#' /lib/systemd/system/docker.service
sudo systemctl daemon-reload && sudo systemctl restart docker

关闭 swap 分区

永久关闭

#/swapfile none swap sw 0 0
sudo vim /etc/fstab

暂时关闭,重启后失效

sudo swapoff -a

kubernetes 三件套

下载 gpg 密钥

curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo tee /etc/apt/trusted.gpg.d/kubernetes-aliyun.gpg >/dev/null

添加 k8s 镜像源

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list >/dev/null
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

更新源列表

sudo apt update

下载 kubectl,kubeadm以及 kubelet

sudo apt install -y kubelet kubeadm kubectl kubernetes-cni

K8s 集群安装

配置 containerd

containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
# 修改 /etc/etc/containerd/config.toml 默认镜像,改成国内或者私有镜像仓库地址
sudo sed -i "s/k8s.gcr.io/registry.aliyuncs.com\/google_containers/g" /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
# 重启 containerd
sudo systemctl restart containerd

安装集群

sudo kubeadm init \
--cri-socket /run/containerd/containerd.sock \
--pod-network-cidr=10.244.0.0/16 \
--image-repository=registry.aliyuncs.com/google_containers
  • 10.244.0.0/16 的含义

对一个用 32 位二进制表示的 IP 地址,前 16 位位网络前缀,即不变的前缀,后面的 16 位是主机地址,是可变的。此处即 10.244 占 16 位,位网络前缀,不变。

  • --pod-network-cidr

指 pod 网络的 IP 地址范围

  • --service-cidr

指 svc 的虚拟 IP 地址范围,默认为 10.96.0.0/12

  • --apiserver-advertise-address

显式指定 apiserver 的 IP 地址

配置 kubectl

此时还不能通过 kubectl 访问,需要将配置文件拷贝到 $HOME/.kube 目录下

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

加入集群

在各个 Node 中执行 kubeadm join ...

  • 添加 Node 的语句如果堵塞,考虑验证 node 节点与 master 节点之间的连通性。
  • 添加 Node 节点完成后,在 master 节点,如果发现 node 节点的状态为 NotReady,还可以考虑查看 master 与各个 node 节点之间的连通性。

安装 CNI 插件

安装 CNI 插件,不然 NODE 会处于 NOT_READY 状态。

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
kubectl apply -f \
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

这个 flannel 有坑,apply 之后,在 pod 中无法访问 k8s 的 api-server。原因可能是上面 apply 的 kube-flannel.yml 中的 flannel 子网段是 10.244.0.0/16

后面确实在文档中找到相关的说明,需要在跑 kubeadm init 的时候,指定 --pod-network-cidr=10.244.0.0/16,也就是和 flannel 指定的网段保持一致。

kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-system
  labels:
    tier: node
    app: flannel
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

而 docker0 网桥的地址范围是 172.17.0.0/16

宿主机路由表

结果

最终,可以在 master 节点通过 kubectl get nodes -o wide 来查看集群的组成信息,如下:

节点信息

其他配置

containerd

  1. 添加非 https 仓库 打开 /etc/containerd/config.toml 文件,添加如下配置:
[plugins]
  [plugins.cri.registry]
    [plugins.cri.registry.mirrors]
      [plugins.cri.registry.mirrors."127.0.0.1:5000"]
        endpoint = ["http://127.0.0.1:5000"]

重启 containerd systemctl restart containerd

CentOS

关闭selinux

sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0

关闭 swap

sudo swapoff -a
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
sudo yum install -y yum-utils
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io

新增依赖

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo >/dev/null
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
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
exclude=kubelet kubeadm kubectl
EOF

修改 docker 的 CgroupDriver。默认的是 cgroupfs,推荐的是 systemd。

vim /etc/docker/daemon.json

{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

systemctl daemon-reload && systemctl restart docker

安装并开启 kubelet 自启动

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable --now kubelet

代理

宿主机设置 v2ray 代理服务

模式选择 global,这里主要是因为没有设置 pac 规则

宿主机 IP:10.211.55.2

虚拟机 IP:10.211.55.3

curl 命令走代理

在 .bashrc 中添加如下变量:

export ALL_PROXY=http://10.211.55.2:8001

让变量生效

source .bashrc

测试

curl -v www.google.com

apt 命令走代理

sudo apt -o Acquire::http::proxy="http://10.211.55.2:8001" update

配置 Docker 代理

vim /lib/systemd/system/docker.service

[Service] 块下面增加一行

Environment="HTTP_PROXY=http://10.211.55.2:8001" "HTTPS_PROXY=https://10.211.55.2:8001"

再重新加载守护进程与重启 docker

systemctl daemon-reload
systemctl restart docker

Reference

https://www.xiebruce.top/796.htmlhttps://forum.ubuntu.org.cn/viewtopic.php?t=476834

Read more

容器镜像(4):镜像的常用工具箱

容器镜像(4):镜像的常用工具箱

前几篇在讲多架构镜像时已经用过 skopeo 和 crane 做镜像复制,这篇系统整理这两个工具的完整能力,同时介绍几个日常操作镜像时同样好用的工具。 一、skopeo:不依赖 Daemon 的镜像瑞士军刀 skopeo 的核心价值是绕过 Docker daemon,直接与 Registry API 交互。上一篇用它做镜像复制和离线传输,但它的能力远不止于此。 1.1 安装 # Ubuntu / Debian sudo apt install -y skopeo skopeo --version # skopeo version 1.15.1 1.2 inspect:免拉取检查镜像元数据 docker inspect 需要先把镜像拉到本地,skopeo inspect 直接向 Registry

容器镜像(3):多架构镜像构建

容器镜像(3):多架构镜像构建

一、什么是多架构镜像 1.1 OCI Image Index 上一篇介绍了单平台镜像的结构:一个 Manifest 指向 Config 和若干 Layer blob。多架构镜像在此之上多了一层——OCI Image Index(也叫 Manifest List),是一个轻量的索引文件,把多个单平台 Manifest 组织在一起: $ docker manifest inspect golang:1.22-alpine { "schemaVersion": 2, "mediaType": "application/vnd.oci.image.index.v1+json", "manifests&

容器镜像(2):containerd 视角下的镜像

容器镜像(2):containerd 视角下的镜像

一、为什么需要了解 containerd 如果你只用 docker run 跑容器,从来不关心底层,那可以不了解 containerd。但如果你在用 Kubernetes,或者想真正理解"容器运行时"是什么,containerd 是绕不开的。 事实上,当你执行 docker run 的时候,containerd 早就在后台悄悄工作了——Docker 从 1.11 版本开始,就把核心运行时剥离出来交给 containerd 负责。 1.1 Docker 的架构演变 早期的 Docker(1.10 及之前)是一个"大一统"的单体程序:一个 dockerd