k8s 集群安装-CentOS 9 + Kubernetes 1.30 + istio 1.22.3

本文档基于 CentOS 9

一、yum源更换为国内镜像站

背景:
CentOS Stream 9 默认启用了包管理工具 dnf,其是 yum 包管理工具的替代品。dnf 与 yum 大部分的命令都是通用的,dnf 也使用 /etc/yum.repos.d/ 进行镜像配置。
CentOS Stream 9 中源被整合入两个文件 centos.repocentos-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

二、安装配置先决条件

  1. 启用 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
  1. 关闭交换分区
swapoff -a
vim /etc/fstab  —注释"/dev/mapper/centos_master-swap swap"一行
  1. 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
  1. 安装容器运行时

为了在 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仓库源

  1. 参考阿里云配置镜像加速器
    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
  1. 安装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)

  1. 安装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
  1. 验证安装的版本
kubectl version --client

#输出信息应为:
#Client Version: v1.30.0
#Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
  1. kubectl自动补全命令
#系统全局设置
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null
sudo chmod a+r /etc/bash_completion.d/kubectl
  1. 创建集群 (只在主节点操作)
 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
  1. 安装网络插件
    1. 参考文档:https://github.com/flannel-io/flannel
    2. 遇到docker镜像拉取失败,更改flannel.yaml 中images 信息,去掉前缀docker.io
    3. 文档中有一个cni-plugin的插件包需要安装到 /opt/cni/bin 目录下
  2. 从节点重复上述 步骤, 保存 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 节点名称被更改
      1. 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
    1. 有一个ztunnel的pod启动时报错 Readiness probe failed: HTTP probe failed with statuscode: 500
    1. 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,需进一步查看文档

五、排坑信息

  1. 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)
  1. 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”
    • image.png

解决方法:

#列出本地已经拉取的镜像
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 打标签
  1. docker镜像无法拉取,锅内镜像站大多失效

csdn博主8月更新-锅内最新可用镜像站

  1. 虚拟机意外停机后,k8s集群不正常(待解决)
    1. 用户权限丢失(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 才能执行相关命令
    2. pod丢失 包括coredns , 拷贝 super-admin.conf 能使用命令后,查看pod缺失
  2. 虚拟机挂起,恢复后,被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可以正常启动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值