本文档基于 CentOS 9
一、yum源更换为国内镜像站
背景:
CentOS Stream 9 默认启用了包管理工具 dnf,其是 yum 包管理工具的替代品。dnf 与 yum 大部分的命令都是通用的,dnf 也使用 /etc/yum.repos.d/
进行镜像配置。
CentOS Stream 9 中源被整合入两个文件 centos.repo
和 centos-addons.repo
,由于文件中不包含 baseurl
字段,需要手动插入,通过文本替换修改源的方法较为复杂,也可以选择直接复制最后的替换结果覆盖源文件。
创建文本替换脚本,复制下方文本, 创建文件update_mirror.pl
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
my $mirrors = 'https://mirrors.tuna.tsinghua.edu.cn/centos-stream';
if (@ARGV < 1) {
die "Usage: $0 <filename1> <filename2> ...\n";
}
while (my $filename = shift @ARGV) {
my $backup_filename = $filename . '.bak';
rename $filename, $backup_filename;
open my $input, "<", $backup_filename;
open my $output, ">", $filename;
while (<$input>) {
s/^metalink/# metalink/;
if (m/^name/) {
my (undef, $repo, $arch) = split /-/;
$repo =~ s/^\s+|\s+$//g;
($arch = defined $arch ? lc($arch) : '') =~ s/^\s+|\s+$//g;
if ($repo =~ /^Extras/) {
$_ .= "baseurl=${mirrors}/SIGs/\$releasever-stream/extras" . ($arch eq 'source' ? "/${arch}/" : "/\$basearch/") . "extras-common\n";
} else {
$_ .= "baseurl=${mirrors}/\$releasever-stream/$repo" . ($arch eq 'source' ? "/" : "/\$basearch/") . ($arch ne '' ? "${arch}/tree/" : "os") . "\n";
}
}
print $output $_;
}
}
执行命令
perl ./update_mirror.pl /etc/yum.repos.d/centos*.repo
注意将 ./update_mirror.pl
替换为脚本实际保存的路径。其中的 *
通配符,如果只需要替换一些文件中的源,请自行增删。
另外,请确保已经安装了 Perl 解释器,并将 perl
命令添加到系统的 PATH
环境变量中。这样才能在命令行中运行 Perl 脚本。
对于大部分 CentOS Stream 9 镜像,应该已经包含了 Perl 解释器,如果你的镜像没有包含,你可以使用以下命令简单的安装:
# 使用 dnf
dnf install perl
# 使用 yum
yum install perl
二、安装配置先决条件
- 启用 IPv4 数据包转发
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
使用以下命令验证 `net.ipv4.ip_forward` 是否设置为 1:
sysctl net.ipv4.ip_forward
- 关闭交换分区
swapoff -a
vim /etc/fstab —注释"/dev/mapper/centos_master-swap swap"一行
- SELinux设置
- 通过运行命令
**setenforce 0**
和**sed ...**
将 SELinux 设置为 permissive 模式相当于将其禁用。 这是允许容器访问主机文件系统所必需的,例如,某些容器网络插件需要这一能力。 你必须这么做,直到 kubelet 改进其对 SELinux 的支持。- 如果你知道如何配置 SELinux 则可以将其保持启用状态,但可能需要设定部分 kubeadm 不支持的配置。
# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
- 安装容器运行时
为了在 Pod 中运行容器,Kubernetes 使用 容器运行时(Container Runtime)。
默认情况下,Kubernetes 使用 容器运行时接口(Container Runtime Interface,CRI) 来与你所选择的容器运行时交互。
Docker Engine 没有实现 CRI, 而这是容器运行时在 Kubernetes 中工作所需要的。 为此,必须安装一个额外的服务 cri-dockerd。 cri-dockerd 是一个基于传统的内置 Docker 引擎支持的项目, 它在 1.24 版本从 kubelet 中移除。
使用Docker-Engine + cri-dockerd
#安装Docker所需驱动
yum install -y device-mapper-persistent-data lvm2
#安装Docker的Yum源
dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#列出Docker-ce版本信息
dnf list docker-ce
#安装Docker
yum install docker-ce-27.1.1
systemctl start docker
systemctl enable docker
systemctl status docker
更改docker仓库源
- 参考阿里云配置镜像加速器
https://help.aliyun.com/zh/acr/user-guide/accelerate-the-pulls-of-docker-official-images
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://docker.anyhub.us.kg","从阿里云获取的个人配置地址"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
systemctl restart docker
systemctl status docker
- 安装cri-dockerd
#安装cri-docker
tar zxf cri-dockerd-0.3.15.amd64.tgz
cd cri-dockerd/
cp cri-dockerd /usr/bin/
#cri-docker.service 文件地址
#https://github.com/Mirantis/cri-dockerd/blob/master/packaging/systemd/cri-docker.service
vi /usr/lib/systemd/system/cri-docker.service
#cri-docker.socket文件地址
#https://github.com/Mirantis/cri-dockerd/blob/master/packaging/systemd/cri-docker.socket
vi /usr/lib/systemd/system/cri-docker.socket
systemctl daemon-reload ; systemctl enable cri-docker --now
systemctl status cri-docker
systemctl is-active cri-docker
systemctl restart cri-docker
三、安装Kubernetes(kubelet + kubeadm + kubectl)
- 安装kubeadm
# 此操作会覆盖 /etc/yum.repos.d/kubernetes.repo 中现存的所有配置
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
sudo yum install -y kubelet-1.30.0 kubeadm-1.30.0 kubectl-1.30.0 --disableexcludes=kubernetes
sudo systemctl enable --now kubelet
- 验证安装的版本
kubectl version --client
#输出信息应为:
#Client Version: v1.30.0
#Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
- kubectl自动补全命令
#系统全局设置
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null
sudo chmod a+r /etc/bash_completion.d/kubectl
- 创建集群 (只在主节点操作)
kubeadm init --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --kubernetes-version=v1.30.0 --pod-network-cidr=10.244.0.0/16 --cri-socket /var/run/cri-dockerd.sock --control-plane-endpoint=cluster-endpoint
- 安装网络插件
- 参考文档:https://github.com/flannel-io/flannel
- 遇到docker镜像拉取失败,更改flannel.yaml 中images 信息,去掉前缀docker.io
- 文档中有一个cni-plugin的插件包需要安装到 /opt/cni/bin 目录下
- 从节点重复上述 步骤, 保存 4 创建集群成功后的信息,从节点执行 join 加入集群即可
重置集群
sudo kubeadm reset -f --cri-socket /var/run/cri-dockerd.sock
systemctl stop kubelet
systemctl disable kubelet
rm -rf /etc/systemd/system/kubelet.service
rm -rf /etc/systemd/system/kube*
sudo rm -rvf $HOME/.kube
sudo rm -rvf ~/.kube/
sudo rm -rvf /etc/kubernetes/
rm -rf /etc/cni/net.d
sudo rm -rf /var/lib/kube*
systemctl is-active cri-docker
systemctl restart cri-docker
sudo systemctl daemon-reload
sudo systemctl restart kubelet
四、istio-Ambient模式
k8s前提环境设置
安装kind
参阅文档 https://kind.sigs.k8s.io/docs/user/quick-start
部署一个新的本地 kind 集群
这一步会去拉取docker镜像 kindest/node:v1.30.0 这个过程需要几分钟的时间,如果太慢可以再打开一个shell窗口docker pull手动拉取,可以看到进度
- done
安装大多数 Kubernetes 集群上默认并未安装的 Kubernetes Gateway API CRD
kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \ { kubectl kustomize “github.com/kubernetes-sigs/gateway-api/config/crd/experimental?ref=v1.1.0” | kubectl apply -f -; } 上传crd压缩文件后可替换为 kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \ { kubectl kustomize ./ | kubectl apply -f -; }
安装istio
以Ambient模式安装
istioctl install --set profile=ambient --skip-confirmation
- 遇到的问题
- 1.安装中k8s 节点名称被更改
-
- istio install 时镜像拉取失败
istio install时拉取镜像默认去docker仓库拉取,可以设置hub参数指定私仓或者可用的镜像站地址,例如 istioctl install --set profile=ambient --set values.global.hub=docker.anyhub.us.kg/istio --skip-confirmation
- 更多安装时参数,参考文档https://istio.io/latest/docs/reference/config/istio.operator.v1alpha1/#IstioOperatorSpec
-
- 有一个ztunnel的pod启动时报错 Readiness probe failed: HTTP probe failed with statuscode: 500
-
- Istio iptables 环境中,xtables 参数问题:iptables-restore:无法初始化表 ‘nat’
本次问题,centos 9 中需要安装iptables模块 modprobe ip_tables 参考issue: https://github.com/istio/istio/issues/23009
Ambient模式需要的组件
- istio-cni 网络插件
- 为什么使用istio-cni 插件?解决了什么问题
Istio CNI 插件就是一个能够替代 istio-init 容器来实现相同的网络功能但却不需要 Istio 用户申请额外的 Kubernetes RBAC 授权的方案。 负责检测属于 Ambient 网格的 Pod, 并配置 Pod 和 ztunnel 节点代理(稍后将安装)之间的流量重定向。
- 与其他cni插件的兼容性?
- Ztunnel组件
- Ztunnel组件的作用
Ambient模式踩坑
- 暴露服务到外部时,Ambient安装模式没有安装ingress,需进一步查看文档
五、排坑信息
- perl执行时报错报错信息如下
Can’t locate autodie.pm in @INC (you may need to install the autodie module) (@INC contains: /usr/local/lib64/perl5/5.32 /usr/local/share/perl5/5.32 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5) at ./update_mirror.pl line 5.
解决方法:
- yum update perl
- cpanm autodie (按提示先安装cpanm)
- kubeadm 初始化失败,报错如下, 很多超时信息
- Aug 11 00:40:19 node1 cri-dockerd[8467]: W0811 00:40:19.777936 8467 logging.go:59] [core] [Server #1] grpc: Server.processUnaryRPC failed to write status: connection error: desc = “transport is closing” Aug 11 00:40:19 node1 cri-dockerd[8467]: W0811 00:40:19.782494 8467 logging.go:59] [core] [Server #1] grpc: Server.processUnaryRPC failed to write status: connection error: desc = “transport is closing” Aug 11 00:41:13 node1 cri-dockerd[8467]: time=“2024-08-11T00:41:13+08:00” level=info msg=“Pulling the image without credentials. Image: registry.k8s.io/pause:3.9”
解决方法:
#列出本地已经拉取的镜像
docker images
#将pause 重新打标
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9 registry.k8s.io/pause:3.9
3. 主节点 reday 了, 从节点状态not ready
解决办法:
- 排查pod是否创建
- 查看从节点docker 镜像是否拉取
- registry.k8s.io/pause 镜像是必要的,如果没有拉取下来可以手动拉取 registry.cn-hangzhou.aliyuncs.com/google_containers/pause 后 重新 docker tag 打标签
- docker镜像无法拉取,锅内镜像站大多失效
- 虚拟机意外停机后,k8s集群不正常(待解决)
- 用户权限丢失(Error from server (Forbidden): clusterrolebindings.rbac.authorization.k8s.io “kubernetes-admin” is forbidden: User “kubernetes-admin” cannot get resource “clusterrolebindings” in API group “rbac.authorization.k8s.io” at the cluster scope)无法执行所有命令,将/etc/kubernets/super-admin.conf 拷贝到 ~/.kube/conf 才能执行相关命令
- pod丢失 包括coredns , 拷贝 super-admin.conf 能使用命令后,查看pod缺失
- 虚拟机挂起,恢复后,被istio注入sidecar的程序不正常,出现报错 Envoy proxy is NOT ready: config received from XDS server, but was rejected: cds updates: 1 successful, 0 rejected; lds updates: 0 successful, 1 rejected
报错信息显示,Envoy is not ready , 经检查,挂起前apply了一个限流配置的envoyfilter,删除此配置,Envoy 恢复正常,sidecar可以正常启动。