kubeadm搭建K8S集群

目录

    • 安装前注意事项
    • 安装步骤(Ubuntu)
        • 更新软件源同时安装基础依赖
        • 添加官方的GPGkey
        • 添加软件的安装源
        • 安装kubeadm系列部署工具
    • 安装步骤(CentOS)
        • 添加软件源
        • 修改SElinux配置
        • 安装kubeadm系列部署工具
    • 配置Cgroup 驱动
        • 改容器runtime配置
        • 改kubelet配置
    • 用kubeadm初始化集群
      • master节点
      • node节点
      • 网络插件
        • 安装CNI插件(更新)
          • ~~两个关键位置需要修改~~ (已更新,旧的部署方式calico不适用)
          • ~~改完之后执行~~
    • 修改service-node-port-range(service的端口范围)
    • 安装 metrics-server

安装前注意事项

比如
1、支持的操作系统版本

  • Ubuntu 16.04+
  • Debian 9+
  • CentOS 7
  • Red Hat Enterprise Linux (RHEL) 7
  • Fedora 25+
  • HypriotOS v1.0.1+
  • Container Linux (测试 1800.6.0 版本)

2、将要用来搭建集群的机器,他们的MAC地址和product_uuid不能重复

3、支持的容器引擎
Docker\containerd\CRI-O 都可以


安装步骤(Ubuntu)

如果使用centos系统,请跳过这里往下看

更新软件源同时安装基础依赖

sudo apt-get update && sudo apt-get install -y apt-transport-https curl

添加官方的GPGkey

(用来验证文件传输过程没有被拦截和篡改)

sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
#或者
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
#国内阿里源
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 

添加软件的安装源

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
#或者
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
#国内阿里源
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

安装kubeadm系列部署工具

# 安装 kubelet , kubeadm , kubectl;前需要再次更新软件源
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
# 安装完成后需要为这三个工具打上标记hold(表示不要更新)
sudo apt-mark hold kubelet kubeadm kubectl
#
#
# 如果是对版本又特别要求可参考如下命令格式
apt-get install -y kubelet=1.23.6-00 kubeadm=1.23.6-00 kubectl=1.23.6-00

安装步骤(CentOS)

添加软件源

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[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
#国内阿里源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

修改SElinux配置

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

安装kubeadm系列部署工具

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

配置Cgroup 驱动

kubelet配置的Cgroup驱动需要与容器runtime配置的Cgroup驱动一致,否则会出问题。

改容器runtime配置

  • docker示例
    关键在于native.cgroupdriver=systemd
sudo mkdir /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "registry-mirrors": ["https://yot2uoql.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
  • containerd示例
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# 应用 sysctl 参数而无需重新启动
sudo sysctl --system
  • CRI-O示例
# 创建 .conf 文件以在启动时加载模块
cat <<EOF | sudo tee /etc/modules-load.d/crio.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 配置 sysctl 参数,这些配置在重启之后仍然起作用
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

sudo sysctl --system

改kubelet配置

kubelet在1.22以后的版本默认使用systemd作为CGroup驱动
更早的kubelet版本需要更改CGroup驱动请跟着下面的操作


我们以docker为例,图中为默认安装。通过docker info我们可以看到当前docker的详细信息
kubeadm搭建K8S集群_第1张图片

kubelet这边,官方文档推荐使用systemd。 并且默认安装的kubelet使用的就是systemd作为Cgroup驱动。
还给出了推荐的理由:

目前很多操作系统默认使用systemd作为CGroup驱动。如果runtime和kubelet都换成cgroupfs作为驱动,将意味着操作系统中存在两种不同的Cgroup管理器。

事实上,采用统一的CGroup驱动,会让人在查看资源使用情况时更方便,并且由用户反馈说用了两种CGroup的操做系统,在面临资源使用压力的时候变得不稳定。
kubeadm搭建K8S集群_第2张图片
https://kubernetes.io/docs/setup/production-environment/container-runtimes/


用kubeadm初始化集群

master节点

$ kubeadm init \
--apiserver-advertise-address=192.168.10.10 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.22.5 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all

–apiserver-advertise-address=192.168.0.220
指定api-server在那台机器上,写master节点的私网IP

–image-repository registry.aliyuncs.com/google_containers
拉取各个组件时使用哪个镜像仓库,这是阿里云的,亲测好用

–kubernetes-version v1.18.0
使用kubernetes哪个版本

–service-cidr=10.96.0.0/12
为svc资源创建一个虚拟网段,不能与宿主机的私网网段有重合

–pod-network-cidr=10.244.0.0/16
为pod资源创建一个虚拟网段,不能与宿主机的私网网段有重合

–ignore-preflight-errors=all
忽略所有报错

kubeadm搭建K8S集群_第3张图片
看到这样的输出表示初始化完成

node节点

按照上一步在master节点上初始化成功后的输出来操作
在node节点执行(复制粘贴)

kubeadm join 192.168.0.220:6443 --token pkbczn.bxzh7rhmd4zbiywe \
--discovery-token-ca-cert-hash sha256:b3fedbf8f47b6349a9fe00ace854ee1112dafb5ce25924c5843c0f36ca761549

然后node节点成功加入集群会有如下提示

kubeadm搭建K8S集群_第4张图片
意思说让我们在master上执行

kubectl get node

来查看已经加入集群的节点
于是我真的去执行,然后就发生了下面的尴尬
在这里插入图片描述
回头看看初始化master节点成功后的提示
kubeadm搭建K8S集群_第5张图片
老老实实照做

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

网络插件

执行完上一步,是不是觉得kubectl应该能用了
没错,它确实能用了,并且还附赠了新的问题在这里插入图片描述
查阅资料得知是缺少CNI网络组件引起的,排查过程就是查看日志,所以省略,
继续老老实实

安装CNI插件(更新)

随着时间推移,版本更新,现在安装CNI网络插件有很多的选择
其实在我们完成master节点初始化的时候,就已经有提示了,让我们去k8s官网查看已经被支持的插件,并且上面有相应的安装教程
https://kubernetes.io/docs/concepts/cluster-administration/addons/
我们继续选calico
kubeadm搭建K8S集群_第6张图片

通过k8s官网链接我们可以快速来到calico的官网,按照install calico—>kubernetes—>Quickstart的顺序正式来到安装教程
如图
kubeadm搭建K8S集群_第7张图片
可以发现calico已经开始用 operator了,不用像以前慢慢获取yaml文件,慢慢改
先安装operater

kubectl create -f https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml

现在只需要照着执行apply就好,要改的东西少了很多

获取custom-resources

wget  https://projectcalico.docs.tigera.io/manifests/custom-resources.yaml

修改custom-resources.yaml

vim custom-resources.yaml

如下图,修改cidr的IP段,这里必须与kubeadm初始化时pod-network-cidr的IP段一致。
kubeadm搭建K8S集群_第8张图片


两个关键位置需要修改 (已更新,旧的部署方式calico不适用)

CALICO_IPV4POOL_CIDR
定义Pod网络,需要与前面初始化master时配置pod CIDR的网段一样
- name: CALICO_IPV4POOL_CIDR
10.244.0.0/16

原文是这样的,需要先去掉注释,然后再做修改
kubeadm搭建K8S集群_第9张图片

CALICO_IPV4POOL_IPIP
选择工作模式,支持BGP(Never)IPIP(Always)CrossSubnet(开启BGP并支持跨子网)
原文是这样的,我们需要确保CALICO_IPV4POOL_IPIP的值为Always,就可以了

kubeadm搭建K8S集群_第10张图片

改完之后执行

kubectl apply -f calico.yaml


实验中看到的现象是这样,coredns,calico的初始化都很慢
这是拉取镜像速度慢导致的,具体可以参考下面第二幅图
kubeadm搭建K8S集群_第11张图片
kubeadm搭建K8S集群_第12张图片
初始化完成后,看到的应该是这样
kubeadm搭建K8S集群_第13张图片

修改service-node-port-range(service的端口范围)

/etc/kubernetes/manifests/kube-apiserver.yaml

安装 metrics-server

https://github.com/kubernetes-sigs/metrics-server

kubeadm搭建K8S集群_第14张图片
常见报错

Failed to scrape node" err="Get \"https://[你的IP]:10250/metrics/resource\": dial tcp [你的IP]:10250: connect: no route to host" node="你的HOSTNAME"

检查防火墙

x509: cannot validate caertficate for [你的IP] because it doesn't contain any IP SANs.

需要拿到yaml文件来修改

wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

---
vim components.yaml
## 找到 metrics-server 的 deployment.spec.template.spec.containers.args , 添加如下参数

 - --kubelet-insecure-tls

kubeadm搭建K8S集群_第15张图片

至此,基本的初始化已经完成.

你可能感兴趣的:(kubernetes,kubernetes)