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

相关推荐
GJCTYU1 小时前
阿里云多端低代码开发平台魔笔使用测评
低代码·阿里云·云原生·容器·serverless·云计算
YCyjs12 小时前
K8S群集调度二
云原生·容器·kubernetes
Hoxy.R12 小时前
K8s小白入门
云原生·容器·kubernetes
为什么这亚子18 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
ZHOU西口20 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
牛角上的男孩20 小时前
Istio Gateway发布服务
云原生·gateway·istio
JuiceFS1 天前
好未来:多云环境下基于 JuiceFS 建设低运维模型仓库
运维·云原生
景天科技苑1 天前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
wclass-zhengge1 天前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇1 天前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决