K3s 1.26版本构建跨公有云的云原生环境

K3s是什么?

K3s 是轻量级的 Kubernetes,是一个完全兼容的 Kubernetes 发行版,占用内存小,非常适合在有限的资源下部署体验云原生环境。

更多参考:官方文档

为什么选择K3s?

笔者趁着腾讯云、天翼云等云服务做活动时,入手了2台轻量级云服务器。在实操K8s相关技术知识时,总觉得用虚拟机缺少了真实环境下的体验。而事实也证明,当尝试用公有云搭建K8s环境时,就遇到了跨Node访问网络不通的问题。

选择K3s的原因:

  • 占用更少的资源:对于2核4G的云服务器,部署一个K8s master节点内存直接就去了一半,更别说搭建Harbor、Gitlab等CICD相关的环境
  • 跨公有云搭建容器集群:公有云暴露的公网IP不在机器网卡上,使用K8s Calico搭建网络环境时,会存在跨Node访问网络不通问题
  • 麻雀虽小五脏俱全:与K8s体验一致,该有的它都有。

快速开始

环境准备

云服务器可以选择Centos7.x系统,这个版本比较成熟,坑会少一些。swap内存交换、firewalld防火墙是默认关闭的。

高版本K8s/K3s默认不再使用Docker,这里我们也可以不安装Docker。

配置hostname

注意每台机器的hostname不要出现相同的名称

shell 复制代码
# 分别在2台云服务器上执行
hostnamectl set-hostname tenxunyun
hostnamectl set-hostname tianyiyun
# 修改完可以执行一下su 切换刷新hostname

开启iptables转发支持

shell 复制代码
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# 加载内核模块,overlay模块是用于实现容器技术中的联合文件系统,br_netfilter模块是Linux内核中用于配置和管理网络过滤规则的模块
sudo modprobe overlay
sudo modprobe br_netfilter

# 开启iptables转发
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 参数而不重新启动
sudo sysctl --system
# 如果执行结果里面/etc/sysctl.conf 中net.ipv4.ip_forward=0,注意需要修改为1

# 验证内核模块是否加载成功
lsmod | grep br_netfilter
lsmod | grep overlay

安装wireguard

K3s 使用 wireguard 为集群流量建立 VPN 网格,实现不同公有云中的节点可以通过公网IP相互访问。

shell 复制代码
sudo yum install epel-release elrepo-release -y
sudo yum install kmod-wireguard wireguard-tools -y
# 安装后先重启系统,然后加载wireguard模块
sudo modprobe wireguard
# 验证wireguard是否加载成功
lsmod | grep wireguard

安装K3s 1.26

K3s架构

K3s 分为控制节点Server、工作节点Agent,对应K8s中master和worker。

这里我们使用Postgresql作为外部数据库,搭建高可用K3s集群。

下面章节示例2节点组成双server节点集群的安装步骤

安装Postgresql 15

可以直接在一台云服务器上安装,参考文档

yaml 复制代码
#安装
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

sudo yum install -y postgresql15-server
sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
sudo systemctl enable postgresql-15
sudo systemctl start postgresql-15

#修改配置,允许远程访问
cd /var/lib/pgsql/15/data && vim postgresql.conf 
listen_addresses = '*'
max_connections = 1000

vim pg_hba.conf 
#最后一行加
host   all              all             0.0.0.0/0                 scram-sha-256

# 重启
 systemctl restart postgresql-15

#修改密码
sudo -i -u postgres
psql
alter user postgres with password '123456';

此时可以使用本地dbeaver访问该Postgresql了,ip是云服务器公网ip,端口是5432,用户名postgres

记得创建一个名为 kubernetes 的数据库

Treafik ingress配置

K3s默认使用Treafik作为Ingress Controller,可以提前配置Treafik EntryPoint入口方便进行TCP端口转发访问容器内的MySQL、Redis等组件。

在每个Server节点的机器上新增traefik配置文件:/var/lib/rancher/k3s/server/manifests/traefik-config.yaml

注意路径和文件名要和上面的一致,这里使用宿主机端口映射hostPort方式

yaml 复制代码
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: traefik
  namespace: kube-system
spec:
  valuesContent: |-
    ports:
      web:
        expose: false
        hostPort: 80
        port: 8000
      websecure:
        expose: false
        hostPort: 443
        port: 8443
      traefik:
        expose: false
       # exposedPort: 9000
        hostPort: 9000
        port: 9000
        protocol: TCP
      mysql:
        expose: false
        #exposedPort: 3306
        hostPort: 3306
        port: 3306
        protocol: TCP
      redis:
        expose: false
        hostPort: 6379
        #exposedPort: 6379
        port: 6379
        protocol: TCP
    service: 
      enabled: false
    deployment:
      replicas: 2
    affinity:
      podAntiAffinity:
        preferredDuringSchedulingIgnoredDuringExecution:
          - podAffinityTerm:
              labelSelector:
                matchExpressions: #用于配置Treafik pod调度到哪个Node
                - key: kubernetes.io/hostname
                  operator: In
                  values: ["你的主机hostname","你的主机hostname"]
              topologyKey: kubernetes.io/hostname
            weight: 1

K3s Server/Agent配置

在每个节点机器的指定目录创建配置文件:/root/rancher/k3s/config.yaml

shell 复制代码
# server节点配置
node-external-ip: 云服务器公网ip
flannel-backend: wireguard-native
flannel-external-ip: true
datastore-endpoint: "postgres://postgres:123456@127.0.0.1:5432/kubernetes"
disable: "servicelb"

# agent节点配置
#node-external-ip: 云服务器公网ip

127.0.0.1修改为pgsql所在的服务器的公网ip。这里禁用了K3s自带的负载均衡器servicelb

执行k3s安装脚本

配置准备完毕后,就可以开始执行安装脚本

注意点:

下载国内站点的k3s安装脚本(rancher提供)

配置镜像仓库为aliyun镜像源

指定K3s版本为v1.26.5+k3s1

shell 复制代码
# 在线安装 (会自动下载安装文件和脚本)
#从国内加速镜像下载安装脚本
wget https://rancher-mirror.rancher.cn/k3s/k3s-install.sh
chmod +x k3s-install.sh
# 在其中一台安装,默认安装server节点
K3S_SYSTEM_DEFAULT_REGISTRY=registry.cn-hangzhou.aliyuncs.com \
K3S_CONFIG_FILE=/root/rancher/k3s/config.yaml \
INSTALL_K3S_MIRROR=cn INSTALL_K3S_VERSION="v1.26.5+k3s1" ./k3s-install.sh

K3s的版本Release Note

如果想安装Rancher,注意K3s不要选择太高的版本,目前Rancher 2.7最高支持1.26版本的K3s,参考Rancher和K3s版本矩阵

kubectl命令环境配置

安装完成后,可以使用k3s命令查看全部pod情况

k3s kubectl get po -A

查看pod占用资源情况

k3s kubectl top po -A

查看机器内存使用情况,会发现K3s基础环境占用内存还不到1G

如果加入agent,会发现agent节点占用的内存更少

free -m

本地安装了kubectl、helm环境的情况,只需要执行以下命令即可使用kubectl、helm管理云环境

cp /etc/rancher/k3s/k3s.yaml ~/.kube/config

添加新的Server节点到K3s集群

shell 复制代码
# 在刚刚安装了K3s机器上查看token,后面K3S_TOKEN会用到
cat /var/lib/rancher/k3s/server/token
# 在新的Server节点上安装K3s并加入集群(记得先下载安装脚本)
K3S_SYSTEM_DEFAULT_REGISTRY=registry.cn-hangzhou.aliyuncs.com \
INSTALL_K3S_MIRROR=cn K3S_URL=https://前面安装K3s的云服务器公网ip:6443 \
K3S_CONFIG_FILE=/root/rancher/k3s/config.yaml \
INSTALL_K3S_EXEC="server" INSTALL_K3S_VERSION="v1.26.5+k3s1" \
K3S_TOKEN=K10b2d0a5c99e33baa3c3deeac8a6c2f0c6b38a0b886e74ffb41c2a5b59cb135698::server:5c5c90b242ca167e3542e2d18115bd5c \
./k3s-install.sh 

# 设置了K3S_URL、K3S_TOKEN 配置后,默认为agent节点;使用INSTALL_K3S_EXEC="server" 后把新节点也作为server节点 添加到集群

前面我们开放了Dashboard端口,此时我们可以访问Treafik Dashboard面板,地址:http://你的云服务器公网ip:9000/dashboard/

更多Treafik配置可以参考官方文档

新增TCP端口转发ingress

有时候我们想在外部使用MySQL、Redis客户端访问MySQL、Redis容器,可以配置TCP转发ingress

先创建namespace: kubectl create ns dev

然后新增traefik-ingTcpRoute.yaml文件

yaml 复制代码
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
  name: mysql-route
  namespace: dev
spec:
  entryPoints:
    - mysql
  routes:
  - match: HostSNI(`*`)
    services:
    - name: mysql
      port: 3306
      
---

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
  name: redis-route
  namespace: dev
spec:
  entryPoints:
    - redis
  routes:
  - match: HostSNI(`*`)
    services:
    - name: redis-master
      port: 6379

然后执行 kubectl apply -f traefik-ingTcpRoute.yaml,如果有在容器内部署MySQL、Redis服务,并且新建了名为mysql、redis-master的Service,此时就可以用本地的dbeaver、Another Redis Desktop Manager访问对应的容器服务了

常用命令

配置简写

每次拼写kubectl比较繁琐,可以配置自动补全和简写

shell 复制代码
#安装自动补全
sudo yum install bash-completion

# 添加简写
echo 'alias k=kubectl' >>~/.bashrc
echo "alias kd='kubectl describe'" >>~/.bashrc
echo "alias klogt='kubectl logs --tail'" >>~/.bashrc

source ~/.bashrc

简写可以按自己的习惯自定义,上面自动了输入k 就是kubectl,kd就是查看pod详情的命令开头,klogt是查看pod日志最后多少行的命令开头

kubectl常用命令和简写

shell 复制代码
kubectl get po -A #查看全部pod
kubectl get pod -o wide #查看pod在哪个ip、node上启动
kubectl get svc -n default #查看default命名空间的service
kubectl describe pod xxx -n xxx #查看pod详情,一般分析启动失败时使用
kubectl logs --tail 20 xxxPod -n xxx #查看pod最后20行日志
kubectl get sts,deploy,ds,cm,ing,rs,secret #查看各种资源情况
# 查看secret中data中password属性的原始内容
k get secret -ngitlab my-gitlab-postgresql-password -o jsonpath='{.data.password}' | base64 --decode 
kubectl get pod -n dev -w # 监听pod变化
k explain deploy.spec.template.spec.containers #查看某类资源下可配置项

k label nodes master1 nodetype=base # 给node加标签
kubectl label pod nginx -n dev version=1.0 #给pod加标签
kubectl get pod -n dev --show-labels # 查看pod 标签
kubectl label pod nginx -n dev version=2.0 --overwrite # 更新标签
kubectl get pod -l "version=2.0" -n dev --show-labels # 筛选
kubectl get pod -l "version!=2.0" -n dev --show-labels # 筛选
kubectl label pod nginx -n dev version- # 删除标签
k delete po -ndev -l 'app in (bookkeeping,usercenter)' #集合筛选

K8s中很多资源都有简写,可以通过下面命令查看全部资源和简写

kubectl api-resources

查看K3s日志

有时候安装、运行出现报错,可以通过查看日志分析

journalctl -u k3s -e #查看server节点日志

journalctl -u k3s-agent -e #查看agent节点日志

如果在加入节点时报错:failed to get CA certs: Get "https://127.0.0.1:6444/cacerts 可能是没有关闭防火墙,在每个节点执行一下:systemctl stop firewalld

停止、卸载K3s

K3s的命令在/usr/local/bin目录

./k3s-killall.sh 停止K3s server节点全部容器

./k3s-agent-uninstall.sh 卸载K3s agent节点环境

./k3s-uninstall.sh 卸载K3s server节点环境

清理磁盘空间

如果发现磁盘空间被占用的太多,可以删除不用的镜像

k3s crictl rmi --prune

相关推荐
阿里云云原生9 小时前
【昨晚 17:00】模力工场联合 HiClaw,聊聊怎么把虾场管明白
云原生
阿里云云原生12 小时前
连登顶会!阿里云多项研究成果大幅提升运维智能精度与效率
云原生
阿里云云原生13 小时前
从养一只虾到开好虾场,HiClaw 规模化养虾的详细解读
云原生
河码匠14 小时前
Kubernests YAML 详细之卷(PV、PVC、StorageClass)
云原生·容器·kubernetes
码上上班15 小时前
k8s控制器,daemonset
云原生·容器·kubernetes
深念Y16 小时前
Docker Desktop 版本与 IDEA 插件兼容性
docker·云原生·容器·api·idea·wsl
llm大模型算法工程师weng17 小时前
AI + Docker + K8s:云原生时代的运维提效实战
运维·人工智能·云原生
步步为营DotNet18 小时前
全面解读C# 14在云原生微服务开发中的创新应用
微服务·云原生·c#