草庐IT

最新的k8s生产环境部署(k8s1.25+containerd+ubuntu20.04)

摸鱼一枚猿 2023-04-18 原文

1、准备7台机器

主机ip主机名说明
192.168.100.128k8s-master01master节点1
192.168.100.129k8s-master02master节点2
192.168.100.130k8s-master03master节点3
192.168.100.131k8s-node01worker节点1
192.168.100.132k8s-node02worker节点2
192.168.100.141haproxy01ha节点1
192.168.100.142haproxy02ha节点2
192.168.100.140ha-vipvip节点

2、使用haproxy01、haproxy02服务器,搭建haproxy、keepalived动态代理服务器,实现负载均衡

#修改内核参数
cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_nonlocal_bind = 1
EOF
#查看内核参数
sysctl -p
#安装配置haproxy
apt update
apt -y install haproxy
# 添加下面行
cat >> /etc/haproxy/haproxy.cfg <<EOF
listen stats
    mode http
    bind 0.0.0.0:8888
    stats enable
    log global
    stats uri /status
    stats auth admin:12345678
listen kubernetes-api-6443
    bind 192.168.100.140:6443
    mode tcp
    server k8s-master01 192.168.100.128:6443 check inter 3s fall 3 rise 3
    server k8s-master02 192.168.100.129:6443 check inter 3s fall 3 rise 3
    server k8s-master03 192.168.100.130:6443 check inter 3s fall 3 rise 3
EOF
# 重启haproxy
systemctl restart haproxy

3、在haproxy01、haproxy02安装Keepalived

安装keepalived实现HAProxy高可用

apt update
apt -y install keepalived
vim /etc/keepalived/keepalived.conf
#内容如下
globla_defs {
	router_id ha1 #在haproxy02上为ha2
}
vrrp_script check_haproxy { #指定脚本
	script "/etc/keepalived/check_haproxy.sh"
	interval 1
	weight -30
	fall 3
	rise 2
	timeout 2
}
vrrp_instance VI_1 {
	state MASTER #在haproxy02上为BACKUP
	interface ens32
	garp_master_delay 10
	smtp_alert
	virtual_router_id 66 #指定虚拟路由器ID,haproxy01和haproxy02此值必须相同
	priority 100
	advert_int 1
	authentication {
		auth_type PASS
		auth_pass 12345678
	}
	virtual_ipaddress {
		192.168.100.140/24 dev ens32 label ens32:1 #指定VIP,haproxy01和haproxy02此值必须相同
	}
	track_script {
		check_haproxy #调用上面定义的脚本
	}
}
# 编写check_haproxy.sh脚本
cat > /etc/keepalived/check_haproxy.sh <<EOF
#!/bin/bash
/usr/bin/killall -0 haproxy || systemctl restart haproxy
EOF
# 修改权限
chmod a+x /etc/keepalived/check_haproxy.sh
# 重启keepalived
systemctl restart keepalived

4、所有主机初始化

4.1 配置ssh key验证

配置ssh key 验证,方便后续同步文件

# 生成密钥
ssh-keygen
# 把密钥发送到其它服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.100.129

4.2 设置主机名和解析

# 设置主机名
hostnamectl set-hostname k8s-master01
# 修改hosts文件
cat > /etc/hosts <<EOF
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.140 ha-vip
192.168.100.128 k8s-master01
192.168.100.129 k8s-master02
192.168.100.130 k8s-master03
192.168.100.131 k8s-node01
192.168.100.132 k8s-node02
192.168.100.141 haproxy01
192.168.100.142 haproxy02
EOF
# 同步配置到其它服务器
for i in {129..132};do scp /etc/hosts 192.168.100.$i:/etc/ ;done
for i in {141..142};do scp /etc/hosts 192.168.100.$i:/etc/ ;done

4.3 禁用swap

# 临时关闭swap
swapoff -a
# 永久关闭swap
sed -i '/swap/s/^/#/' /etc/fstab

4.4 时间同步

# 借助于chronyd服务设定各节点时间精确同步
apt -y install chrony
# 执行同步
chronyc sources -v

4.5 禁用防火墙

# 禁用默认配置的iptables防火墙服务
ufw diable
ufw status

4.6 内核参数调整

如果是安装docker会自动配置以下的内核参数,无需手动实现

如果安装containerd,需要手动配置

允许iptables检查桥接流量,若要显式加载此模块,需运行modprobe br_netfilter

为让linux节点的iptables能够正确查看桥接流量,还需要确认net.bridge.bridge-nf-call-iptables设置为1

# 加载模块
modprobe overlay
modprobe br_netfilter
# 开机加载
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# 设置所需的sysctl参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用sysctl参数而不重新启动
sysctl --system

5 所有主机安装Containerd

5.1 包安装Containerd

在所有节点安装Containerd

#Ubuntu20.04利用内置仓库安装containerd
apt update
apt -y install containerd
# 服务启动
systemctl status containerd
# 利用containerd的客户端工具ctr验证修改是否成功
containerd --version
ctr version
# 修改containerd配置,将sanbox_image镜像源设置为阿里云google_containers镜像源
mkdir /etc/containerd/
# 产生containerd默认配置文件
containerd config default > /etc/containerd/config.toml

grep sandbox_image /etc/containerd/config.toml
# 替换
sed -i "s#k8s.gcr.io/pause#registry.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml
# 镜像加速
vim /etc/containerd/config.toml
# 在此行下面加两行
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
	[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
		endpoint = ["https://registry.aliyuncs.com"]
# 配置containerd cgroup驱动程序systemd
# 替换
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
# 查看SystemdCgroup参数
grep SystemdCgroup /etc/containerd/config.toml
# 重启containerd
systemctl restart containerd

5.2 二进制安装Containerd

Containerd有两种二进制安装包:

  • containerd-xxx: 不包含runC,需要单独安装runc
  • cri-containerd-cni-xxx:包含runC和kubernetes里的所需要的相关文件

5.2.1 下载Containerd

地址

解压到根目录 tar xf cri-containerd-cni-版本号-linux-amd64.tar.gz -C /

5.2.2 配置containerd

# 修改containerd的配置,将sandox_image镜像源设置为阿里云google_containers镜像源
mkdir /etc/containerd/
# 产生containerd默认配置文件
containerd config default > /etc/containerd/config.toml

grep sandbox_image /etc/containerd/config.toml
# 替换
sed -i "s#k8s.gcr.io/pause#registry.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml
# 镜像加速
vim /etc/containerd/config.toml
# 在此行下面加两行
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
	[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
		endpoint = ["https://registry.aliyuncs.com"]

systemctl daemon-reload
systemctl status containerd
systemctl enable --now containerd
systemctl is-active containerd

5.2.3 安装CNI插件工具

解决CNI问题

# 下载链接https://github.com/containernetworking/plugins/releases
wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz
# 覆盖原有文件
tar xf cni-plugins-linux-amd64-v1.1.1.tgz -C /opt/cni/bin

6 所有主机安装kubeadm、kubelet和kubectl

通过国内镜像站点阿里云安装 的参考链接

阿里云安装

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

curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 

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

for i in {128..132};do scp /etc/apt/sources.list.d/kubernetes.list 192.168.100.$i:/etc/apt/sources.list.d/;done

apt-get update

#查看版本
apt-cache madison kubeadm|head
#安装指定版本
apt install -y kubeadm=1.25.0-00 kubelet=1.25.0-00 kubectl=1.25.0-00
#安装最新版本
apt install -y kubeadm kubelet kubectl

7 在第一个master节点初始化kubernetes集群

初始化参数说明:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m8cLPun1-1664185593468)(D:\software\学习资料\自编文档\imgs\image-20220921122016588.png)]

初始化集群:

# 命令加参数的方式
kubeadm init --control-plane-endpoint="ha-vip" --kubernetes-version=v1.25.1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --token-ttl=0 --image-repository registry.aliyuncs.com/google_containers --upload-certs

8 在第一个master节点生成kubectl命令的授权文件

kubectl是kube-apiserver的命令行客户端程序,实现了除系统部署之外的几乎全部的管理操作,是kubernetes管理员使用最多的命令之一。kubectl需经由API server认证及授权以后才能执行相应的管理操作。kubeadm部署的集群为其生成了一个具有管理员权限的认证配置文件/etc/kubernetes/admin.conf,它可由kubectl通过默认的$home/.kube/config的路径进行加载。用户也可以在kubectl命令上使用–kubeconfig选项指定一个另的位置。

下面复制认证为kubernetes系统管理员的配置文件到目标用户的家目录下:

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

9 实现kubectl命令补全

安装bash-completion工具
sudo apt install bash-completion

执行bash_completion
source /usr/share/bash-completion/bash_completion

#在bash shell 中永久的添加自动补全(永久有效,不受切换终端影响)
echo "source <(kubectl completion bash)" >> ~/.bashrc

10 在第一个master节点配置网络组件

kubernetes系统中的pod网络的实现依赖于第三方插件进行,简单易用的是为CoreOS担任的flannel项目。但由于国内无法访问,我们使用calico

在初始化的第一个master节点上运行如下命令,向kubernetes部署calico。

# 默认没有网络插件,显示如下状态
kubectl get nodes

curl https://docs.projectcalico.org/manifests/calico.yaml -O
#修改CIDR
- name: CALICO_IPV4POOL_CIDR
  value: "10.244.0.0/16" #与初始化集群的--pod-network-cidr=10.244.0.0/16一致
# 指定网卡
  - name: CLUSTER_TYPE
    value: "k8s,bgp"
  # 下面添加
  - name: IP_AUTODETECTION_METHOD
    value: "interface=ens32" # ens32为本地网卡名字
# 安装
kubectl apply -f calico.yaml

# 再次查看状态
kubectl get nodes

10 将所有worker节点加入kubernetes集群中

kubeadm join ha-vip:6443 --token 值 --discovery-token-ca-cert-hash 值
如:
kubeadm join ha-vip:6443 --token mmujyx.fb3o1p1lsvit6ubr \
        --discovery-token-ca-cert-hash sha256:743c18de023175241bbe5ee8a1903d9c0b32bb01755e29462cece4e4d8276d1b
# 其它主节点加入集群
kubeadm join ha-vip:6443 --token 值 --discovery-token-ca-cert-hash 值 --control-plane --certificate-key 值
如:
kubeadm join ha-vip:6443 --token mmujyx.fb3o1p1lsvit6ubr \
        --discovery-token-ca-cert-hash sha256:743c18de023175241bbe5ee8a1903d9c0b32bb01755e29462cece4e4d8276d1b \
        --control-plane --certificate-key 368be5b6bd9ebc2644406dadf9fe96e08fc095ef502570223f9d3ef1c7fb1da3

11 Containerd客户端工具

11.1 ctr和crictl

ctr是由containerd提供的一个客户端工具。

crictl是CRI兼容的容器运行时命令接口,和containerd无关,由kubernetes提供,可以使用它来检查和调试k8s节点上的容器运行时和应用程序。

命令dockerctrcrictl
查看镜像docker imagesctr image lscrictl images
拉取镜像docker pullctr image pullcrictl pull
推送镜像docker pushctr image push
删除镜像docker rmictr image rmcrictl rmi
导入镜像docker loadctr image import
导出镜像docker savectr image export
修改镜像标签docker tagctr image tag
创建一个新的容器docker createctr container createcrictl create
运行一个新的容器docker runctr run
删除容器docker rmctr container rmcrictl rm
查看运行容器docker psctr task ls / ctr container lscrictl ps
启动已有容器docker startctr task startcrictl start
关闭已有容器docker stopctr task killcrictl stop
在容器内部执行命令docker execcrictl exec
查看容器内信息docker inspectctr container infocrictl inspect
查看容器日志docker logscrictl logs
查看容器资源docker statscrictl stats

11.2 nerdctl

nerdctl是与Docker兼容的CLI for Containerd,其支持compose

nerdctl和docker命令行语法类似

nerdctl发布包含两安装版本:

  • Mininal:仅包含nerdctl二进制文件以及rootless模式下的辅助安装脚本
  • Full:包含containerd、CNI、runC、BuildKit等完整组件

11.2.1 安装与使用

11.2.1.1 单机使用nerdctl 代替docker
# 在新主机使用nerdctl代替docker
wget https://github.com/containerd/nerdctl/releases/download/v0.23.0/nerdctl-full-0.23.0-linux-amd64.tar.gz
# 查看文件内容
tar tf nerdctl-full-0.23.0-linux-amdj64.tar.gz
# 解压
tar zxvf nerdctl-full-0.23.0-linux-amdj64.tar.gz -C /usr/local
# 启动
systemctl enable --now containerd
# 查看帮助
nerdctl --help

12 token过期

#查看token
kubectl get secret -n kube-system
kubectl get secret -n kube-system bootstrap-token-mmujyx -oyaml
#重新生成token
kubeadm token create --print-join-command
# 请注意,证书密钥可以访问集群敏感数据,请保密!作为保障,上传的证书将在两小时内删除
kubeadm init phase upload-certs --upload-certs

13 Metrics部署和Dashboard部署

13.1 部署Metrics

# 创建目录
mkdir ~/metrics
# 下载metrics配置文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 修改文件
containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls # 加入参数 
        image: registry.aliyuncs.com/google_containers/metrics-server:v0.6.1 # 替换成国内镜像
# 应用
kubectl apply -f components.yaml

13.2 部署Dashboard(推荐使用kuboard)

# 下载安装文件
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

问题:访问不了raw.githubusercontent.com

解决:1、查询对应ip raw.githubusercontent.com服务器iP raw.githubusercontent.com域名解析 raw.githubusercontent.comiP查询 raw.githubusercontent.com域名iP查询 (ip138.com)

2、修改hosts

185.199.109.133 raw.githubusercontent.com

14 卸载k8s

# 删除所有的k8s节点
kubectl delete node --all
# 重置kubeadm
kubeadm reset
modprode -r ipip
lsmod
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.serive
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd
apt uninstall kube*

有关最新的k8s生产环境部署(k8s1.25+containerd+ubuntu20.04)的更多相关文章

  1. ruby - 如何在 Ubuntu 中清除 Ruby Phusion Passenger 的缓存? - 2

    我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:

  2. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  3. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  4. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  5. ruby - ri 有空文件 – Ubuntu 11.10, Ruby 1.9 - 2

    我正在运行Ubuntu11.10并像这样安装Ruby1.9:$sudoapt-getinstallruby1.9rubygems一切都运行良好,但ri似乎有空文档。ri告诉我文档是空的,我必须安装它们。我执行此操作是因为我读到它会有所帮助:$rdoc--all--ri现在,当我尝试打开任何文档时:$riArrayNothingknownaboutArray我搜索的其他所有内容都是一样的。 最佳答案 这个呢?apt-getinstallri1.8编辑或者试试这个:(非rvm)geminstallrdocrdoc-datardoc-da

  6. ruby - 在 Ubuntu 14.04 中使用 Curl 安装 RVM 时出错 - 2

    我试图在Ubuntu14.04中使用Curl安装RVM。我运行了以下命令:\curl-sSLhttps://get.rvm.io|bash-sstable出现如下错误:curl:(7)Failedtoconnecttoget.rvm.ioport80:Networkisunreachable非常感谢解决此问题的任何帮助。谢谢 最佳答案 在执行curl之前尝试这个:echoipv4>>~/.curlrc 关于ruby-在Ubuntu14.04中使用Curl安装RVM时出错,我们在Stack

  7. ruby - rails 3.2.2(或 3.2.1)+ Postgresql 9.1.3 + Ubuntu 11.10 连接错误 - 2

    我正在使用PostgreSQL9.1.3(x86_64-pc-linux-gnu上的PostgreSQL9.1.3,由gcc-4.6.real(Ubuntu/Linaro4.6.1-9ubuntu3)4.6.1,64位编译)和在ubuntu11.10上运行3.2.2或3.2.1。现在,我可以使用以下命令连接PostgreSQLsupostgres输入密码我可以看到postgres=#我将以下详细信息放在我的config/database.yml中并执行“railsdb”,它工作正常。开发:adapter:postgresqlencoding:utf8reconnect:falsedat

  8. ruby-on-rails - Ubuntu 14.04 Rails 丢失文件 - 2

    安装Rails时,一切都很好,但后来,我写道:rails-v和输出:/home/toshiba/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in`require':cannotloadsuchfile--rails/cli(LoadError)from/home/toshiba/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in`r

  9. Ubuntu20.04系统WineHQ7.0安装微信 - 2

    提供3种Ubuntu系统安装微信的方法,在Ubuntu20.04上验证都ok。1.WineHQ7.0安装微信:ubuntu20.04安装最新版微信--可以支持微信最新版,但是适配的不是特别好;比如WeChartOCR.exe报错。2.原生微信安装:linux系统下的微信安装(ubuntu20.04)--微信适配的最好,反应最快,但是微信版本只到2.1.1,版本太老,很多功能都没有。3.深度deepin-wine6安装微信:ubuntu20.04+系统deepin-wine6安装新版微信--综合比较好,当前个人使用此种方法1个月,微信版本3.4;没什么大问题,尚可。一、WineHQ7.0安装微信

  10. ruby-on-rails - 无法构建 gem native 扩展 (mkmf (LoadError)) - Ubuntu 12.04 - 2

    这个问题在这里已经有了答案:Unabletoinstallgem-Failedtobuildgemnativeextension-cannotloadsuchfile--mkmf(LoadError)(17个答案)关闭9年前。嘿,我正在尝试在一台新的ubuntu机器上安装rails。我安装了ruby​​和rvm,但出现“无法构建gemnative扩展”错误。这是什么意思?$sudogeminstallrails-v3.2.9(没有sudo表示我没有权限)然后它会输出很多“获取”命令,最终会出现这个错误:Buildingnativeextensions.Thiscouldtakeawhi

随机推荐