比如
1、支持的操作系统版本
2、将要用来搭建集群的机器,他们的MAC地址和product_uuid不能重复
3、支持的容器引擎
Docker\containerd\CRI-O 都可以
如果使用centos系统,请跳过这里往下看
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
(用来验证文件传输过程没有被拦截和篡改)
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
# 安装 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
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
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
sudo systemctl enable --now kubelet
kubelet配置的Cgroup驱动需要与容器runtime配置的Cgroup驱动一致,否则会出问题。
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
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
# 创建 .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在1.22以后的版本默认使用systemd作为CGroup驱动
更早的kubelet版本需要更改CGroup驱动请跟着下面的操作
我们以docker为例,图中为默认安装。通过docker info我们可以看到当前docker的详细信息
kubelet这边,官方文档推荐使用systemd。 并且默认安装的kubelet使用的就是systemd作为Cgroup驱动。
还给出了推荐的理由:
目前很多操作系统默认使用systemd作为CGroup驱动。如果runtime和kubelet都换成cgroupfs作为驱动,将意味着操作系统中存在两种不同的Cgroup管理器。
事实上,采用统一的CGroup驱动,会让人在查看资源使用情况时更方便,并且由用户反馈说用了两种CGroup的操做系统,在面临资源使用压力的时候变得不稳定。
https://kubernetes.io/docs/setup/production-environment/container-runtimes/
$ 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
忽略所有报错
按照上一步在master节点上初始化成功后的输出来操作
在node节点执行(复制粘贴)
kubeadm join 192.168.0.220:6443 --token pkbczn.bxzh7rhmd4zbiywe \
--discovery-token-ca-cert-hash sha256:b3fedbf8f47b6349a9fe00ace854ee1112dafb5ce25924c5843c0f36ca761549
然后node节点成功加入集群会有如下提示
kubectl get node
来查看已经加入集群的节点
于是我真的去执行,然后就发生了下面的尴尬
回头看看初始化master节点成功后的提示
老老实实照做
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网络插件有很多的选择
其实在我们完成master节点初始化的时候,就已经有提示了,让我们去k8s官网查看已经被支持的插件,并且上面有相应的安装教程
https://kubernetes.io/docs/concepts/cluster-administration/addons/
我们继续选calico
通过k8s官网链接我们可以快速来到calico的官网,按照install calico—>kubernetes—>Quickstart的顺序正式来到安装教程
如图
可以发现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段一致。
CALICO_IPV4POOL_CIDR
定义Pod网络,需要与前面初始化master时配置pod CIDR的网段一样
- name: CALICO_IPV4POOL_CIDR
10.244.0.0/16
原文是这样的,需要先去掉注释,然后再做修改
CALICO_IPV4POOL_IPIP
选择工作模式,支持BGP(Never)、IPIP(Always)、CrossSubnet(开启BGP并支持跨子网)
原文是这样的,我们需要确保CALICO_IPV4POOL_IPIP的值为Always,就可以了
kubectl apply -f calico.yaml
实验中看到的现象是这样,coredns,calico的初始化都很慢
这是拉取镜像速度慢导致的,具体可以参考下面第二幅图
初始化完成后,看到的应该是这样
/etc/kubernetes/manifests/kube-apiserver.yaml
https://github.com/kubernetes-sigs/metrics-server
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
至此,基本的初始化已经完成.