二进制部署

本文详细介绍了K8S多Master集群的搭建过程。包括操作系统初始化、部署docker引擎、搭建etcd集群、部署master和Worker Node组件、配置CNI网络和CoreDNS,以及实现多Master高可用。通过一系列操作,最终完成K8S多Master集群的搭建。

准备

需要三台设备:一台master,两台node,etcd安装在node里

master/node:192.168.116.21

node01:192.168.116.22

node02:192.168.116.23

1、操作系统初始化配置

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

关闭selinux

setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config

关闭swap

swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab 

根据规划设置主机名

hostnamectl set-hostname master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02

在master添加hosts

cat >> /etc/hosts << EOF
192.168.116.21 master01
192.168.116.22 node01
192.168.116.23 node02
EOF

调整内核参数

cat > /etc/sysctl.d/k8s.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF
​
sysctl --system

时间同步

yum install ntpdate -y
ntpdate time.windows.com

2、所有 node 节点部署docker引擎

yum install -y yum-utils device-mapper-persistent-data lvm2

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

yum install -y docker-ce docker-ce-cli containerd.io

systemctl start docker.service

systemctl enable docker.service 

2.1、修改docker配置文件

docker info
查看默认存储引擎是cgroupfs引擎

添加一个.json结尾的配置文件

cd /etc/docker
vim daemon.json
{
  "registry-mirrors":["https://6ijb8ubo.mirror.aliyuncs.com"],
  "exec-opts":["native.cgroupdriver=systemd"],
  "log-dirver": "json-file",
  "log-opts": {
     "max-size":"500m","max-file": "3"
  }
}
---------------------------------------------------------------------------
​
仓库镜像地址
"registry-mirrors":["https://6ijb8ubo.mirror.aliyuncs.com"]
​
设置cgroup引擎为systemd
"exec-opts":["native.cgroupdriver=systemd"],
​
日志的配置
 "log-dirver": "json-file",
  "log-opts": {
     "max-size":"500m","max-file": "3"
​
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver":"json-file",
  "log-opts":{
    "max-size":"500m","max-file":"3"
   }
}
EOF
systemctl restart docker.service
#再查看引擎是否更改
docker info | grep "Cgroup Driver"
 Cgroup Driver: systemd

 

 

3、搭建etcd集群

  • etcd 目前默认使用2379端口提供HTTP API服务, 2380端口和peer通信

  • etcd 在生产环境中一般推荐集群方式部署。由于etcd 的leader选举机制,要求至少为3台或以上的奇数台。

了解etcd特性

特性说明
分布式存储etcd的数据存储式分布式的,可以跨多个节点进行分布,确保高可用性和可扩展性
强制性etcd提供强一致性的保证,确保在集群中的所有节点都能看到相同的数据视图
轻量级etcd采用轻量级的raft算法,确保集群中的节点之间达成一致
API支持etcd提供简单而强大的HTTP+JSON API,使开发人员可以轻松的与其进行交互,并集成到各种应用和工具中。
监听机制(watch机制)etcd支持监听机制,允许客户监视特定键的变化,并在数据发生变更时得到通知。
安全性etcd支持SSL/TLS加密。以保障数据在传输过程中的安全性,并提供基于角色的访问控制。

3.1、使用cfssl工具签发证书和私钥文件

CFSSL 使用配置文件生成证书,因此自签之前,需要生成它识别的 json 格式的配置文件,CFSSL 提供了方便的命令行生成配置文件。

CFSSL 用来为 etcd 提供 TLS 证书,它支持签三种类型的证书:

证书说明
客户端证书(client 证书)服务端连接客户端时携带的证书,用于客户端验证服务端身份,如 kube-apiserver 访问 etcd
服务端证书(server 证书)客户端连接服务端时携带的证书,用于服务端验证客户端身份,如 etcd 对外提供服务
peer 证书集群内相互之间连接时使用的证书,如 etcd 节点之间进行验证和通信。

以上是安全级别最高的情况下所使用的三套安全证书。

这里全部都使用同一套证书认证。

3.1.1在master节点上生成证书

准备cfssl证书生成工具
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfo
​
-----------------------------------------------------------------------------------------
cfssl:证书签发的工具命令
cfssljson:将 cfssl 生成的证书(默认为json格式)转化为文件承载式证书
cfssl-certinfo:验证证书的信息
​
#查看证书的信息
cfssl-certinfo -cert <证书名称>  
#将文件传入到/usr/local/bin目录下
cd /usr/local/bin
#给他们可执行的权限
chmod +x /usr/local/bin/cfssl*

 

cfssl version #检查版本

 

将master和node节点的/opt目录下所有的文件清空
在master节点上创建一个k8s的安装目录
mkdir k8s
进入目录中上传两个etcd的脚本文件
etcd-cert.sh生成证书和私钥的文件
etcd.sh启动etcd服务的脚本文件
vim etcd-cert.sh

#!/bin/bash
#配置证书生成策略,让 CA 软件知道颁发有什么功能的证书,生成用来签发其他组件证书的根证书
cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "www": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF

#ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;
#后续在签名证书时会使用某个 profile;此实例只有一个 www 模板。
#expiry:指定了证书的有效期,87600h 为10年,如果用默认值一年的话,证书到期后集群会立即宕掉
#signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
#key encipherment:表示使用非对称密钥加密,如 RSA 加密;
#server auth:表示client可以用该 CA 对 server 提供的证书进行验证;
#client auth:表示server可以用该 CA 对 client 提供的证书进行验证;
#注意标点符号,最后一个字段一般是没有逗号的。


#-----------------------
#生成CA证书和私钥(根证书和私钥)
#特别说明: cfssl和openssl有一些区别,openssl需要先生成私钥,然后用私钥生成请求文件,最后生成签名的证书和私钥等,但是cfssl可以直接得到请求文件。
cat > ca-csr.json <<EOF
{
    "CN": "etcd",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing"
        }
    ]
}
EOF

#CN:Common Name,浏览器使用该字段验证网站或机构是否合法,一般写的是域名 
#key:指定了加密算法,一般使用rsa(size:2048)
#C:Country,国家
#ST:State,州,省
#L:Locality,地区,城市
#O: Organization Name,组织名称,公司名称
#OU: Organization Unit Name,组织单位名称,公司部门

cfssl gencert -initca ca-csr.json | cfssljson -bare ca

#生成的文件:
#ca-key.pem:根证书私钥
#ca.pem:根证书
#ca.csr:根证书签发请求文件

#cfssl gencert -initca <CSRJSON>:使用 CSRJSON 文件生成新的证书和私钥。如果不添加管道符号,会直接把所有证书内容输出到屏幕。
#注意:CSRJSON 文件用的是相对路径,所以 cfssl 的时候需要 csr 文件的路径下执行,也可以指定为绝对路径。
#cfssljson 将 cfssl 生成的证书(json格式)变为文件承载式证书,-bare 用于命名生成的证书文件。


#-----------------------
#生成 etcd 服务器证书和私钥
cat > server-csr.json <<EOF
{
    "CN": "etcd",
    "hosts": [
    "192.168.116.21",
    "192.168.116.22",
    "192.168.116.23"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing"
        }
    ]
}
EOF

#hosts:将所有 etcd 集群节点添加到 host 列表,需要指定所有 etcd 集群的节点 ip 或主机名不能使用网段,新增 etcd 服务器需要重新签发证书。

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server

#生成的文件:
#server.csr:服务器的证书请求文件
#server-key.pem:服务器的私钥
#server.pem:服务器的数字签名证书

#-config:引用证书生成策略文件 ca-config.json
#-profile:指定证书生成策略文件中的的使用场景,比如 ca-config.json 中的 www
vim etcd.sh

#!/bin/bash
#example: ./etcd.sh etcd01 192.168.116.21 etcd02=https://192.168.116.22:2380,etcd03=https://192.168.116.23:2380

#创建etcd配置文件/opt/etcd/cfg/etcd
ETCD_NAME=$1
ETCD_IP=$2
ETCD_CLUSTER=$3

WORK_DIR=/opt/etcd

cat > $WORK_DIR/cfg/etcd  <<EOF
#[Member]
ETCD_NAME="${ETCD_NAME}"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://${ETCD_IP}:2380"
ETCD_LISTEN_CLIENT_URLS="https://${ETCD_IP}:2379"

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://${ETCD_IP}:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://${ETCD_IP}:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://${ETCD_IP}:2380,${ETCD_CLUSTER}"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF

#Member:成员配置
#ETCD_NAME:节点名称,集群中唯一。成员名字,集群中必须具备唯一性,如etcd01
#ETCD_DATA_DIR:数据目录。指定节点的数据存储目录,这些数据包括节点ID,集群ID,集群初始化配置,Snapshot文件,若未指定-wal-dir,还会存储WAL文件;如果不指定会用缺省目录
#ETCD_LISTEN_PEER_URLS:集群通信监听地址。用于监听其他member发送信息的地址。ip为全0代表监听本机所有接口
#ETCD_LISTEN_CLIENT_URLS:客户端访问监听地址。用于监听etcd客户发送信息的地址。ip为全0代表监听本机所有接口

#Clustering:集群配置
#ETCD_INITIAL_ADVERTISE_PEER_URLS:集群通告地址。其他member使用,其他member通过该地址与本member交互信息。一定要保证从其他member能可访问该地址。静态配置方式下,该参数的value一定要同时在--initial-cluster参数中存在
#ETCD_ADVERTISE_CLIENT_URLS:客户端通告地址。etcd客户端使用,客户端通过该地址与本member交互信息。一定要保证从客户侧能可访问该地址
#ETCD_INITIAL_CLUSTER:集群节点地址。本member使用。描述集群中所有节点的信息,本member根据此信息去联系其他member
#ETCD_INITIAL_CLUSTER_TOKEN:集群Token。用于区分不同集群。本地如有多个集群要设为不同
#ETCD_INITIAL_CLUSTER_STATE:加入集群的当前状态,new是新集群,existing表示加入已有集群。


#创建etcd.service服务管理文件
cat > /usr/lib/systemd/system/etcd.service <<EOF
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=${WORK_DIR}/cfg/etcd
ExecStart=${WORK_DIR}/bin/etcd \
--cert-file=${WORK_DIR}/ssl/server.pem \
--key-file=${WORK_DIR}/ssl/server-key.pem \
--trusted-ca-file=${WORK_DIR}/ssl/ca.pem \
--peer-cert-file=${WORK_DIR}/ssl/server.pem \
--peer-key-file=${WORK_DIR}/ssl/server-key.pem \
--peer-trusted-ca-file=${WORK_DIR}/ssl/ca.pem \
--logger=zap \
--enable-v2
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

#--enable-v2:开启 etcd v2 API 接口。当前 flannel 版本不支持 etcd v3 通信
#--logger=zap:使用 zap 日志框架。zap.Logger 是go语言中相对日志库中性能最高的
#--peer开头的配置项用于指定集群内部TLS相关证书(peer 证书),这里全部都使用同一套证书认证
#不带--peer开头的的参数是指定 etcd 服务器TLS相关证书(server 证书),这里全部都使用同一套证书认证


systemctl daemon-reload
systemctl enable etcd
systemctl restart etcd

生成CA证书、etcd 服务器证书以及私钥

./etcd-cert.sh
mkdir etcd-cert
mv ca* server* etcd-cert

3.2解压etcd软件包,获取二进制文件 etcd etcdctl



解压
tar xf etcd-v3.4.26-linux-amd64.tar.gz
[root@master01 etcd-v3.4.26-linux-amd64]# ls
Documentation  etcd  etcdctl  README-etcdctl.md  README.md  READMEv2-etcdctl.md


​
etcd是启动etcd程序进程用的
etcdctl是etcd命令行客户端的工具


3.3准备etcd集群配置文件

创建用于存放 etcd 配置文件,命令文件,证书的目录

mkdir -p /opt/etcd/{cfg,bin,ssl}
​
----------------------------------
cfg:存放配置文件的目录
bin:存放命令文件的目录
ssl:存放证书的目录

将etcd和etcdctl移动到bin目录

mv /opt/k8s/etcd-v3.4.26-linux-amd64/etcd etcdctl  /opt/etcd/bin
创建软连接,方便以后直接调用
ln -s /opt/etcd/bin/* /usr/local/bin/
cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/

3.4启动etcd进程服务,将所有节点加入到etcd集群中

cd /opt/k8s/
​
./etcd.sh etcd01 192.168.116.21 etcd02=https://192.168.116.22:2380,etcd03=https://192.168.116.23:2380
​
进入卡住状态等待其他节点加入,这里需要三台etcd服务同时启动,如果只启动其中一台后,服务会卡在那里,直到集群中所有etcd节点都已启动

 

3.4.1可另外打开一个窗口查看etcd进程是否正常
netstat -lntp | grep 2379
或
ps -aux | grep etcd
或
ps -ef | grep etcd
3.4.2把etcd相关证书文件、命令文件和服务管理文件全部拷贝到另外两个etcd集群节点
scp -r /opt/etcd/ node01:/opt/
scp -r /opt/etcd/ node02:/opt/
​
scp /usr/lib/systemd/system/etcd.service node01:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service node02:/usr/lib/systemd/system/
3.4.3进入node01和node02里更改配置文件
vim /opt/etcd/cfg/etcd

更改完之后开启etcd
​
systemctl enable --now etcd
netstat -lntp | grep 2379
成功后,这样所有的etcd服务全部起来了

3.4.4检查etcd群集状态
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.116.21:2379,https://192.168.116.22:2379,https://192.168.116.23:2379" endpoint health --write-out=table
​
​
​
​
​
--cert-file:识别HTTPS端使用SSL证书文件
--key-file:使用此SSL密钥文件标识HTTPS客户端
--ca-file:使用此CA证书验证启用https的服务器的证书
--endpoints:集群中以逗号分隔的机器地址列表
cluster-health:检查etcd集群的运行状况
3.4.5查看etcd集群成员列表
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.116.21:2379,https://192.168.116.22:2379,https://192.168.116.23:2379" --write-out=table member list

4.部署master组件

4.1在 master01 节点上操作

上传 master.zip 和 k8s-cert.sh 到 /opt/k8s 目录中,解压 master.zip 压缩包

cd /opt/k8s/
​
unzip master.zip
chmod +x *.sh

4.2准备证书

vim k8s-cert.sh

创建用于生成CA证书、相关组件的证书和私钥的目录
mkdir k8s-cert
mv k8s-cert.sh k8s-cert
cd k8s-cert/
chmod +x k8s-cert.sh
​
生成CA证书、相关组件的证书和私钥
./k8s-cert.sh

 

创建一个k8s的软件目录

cd /opt
mkdir kubernetes
​
cd kubernetes/
mkdir bin cfg ssl logs
​
​
cp /opt/k8s/k8s-cert/*.pem /opt/kubernetes/ssl

4.3 准备二进制文件

上传二进制包

cd /opt/k8s
​
tar xf kubernetes-server-linux-amd64.tar.gz

复制master组件的关键命令文件到 kubernetes工作目录的 bin 子目录中

cd /opt/k8s/kubernetes/server/bin
cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
​
ln -s /opt/kubernetes/bin/* /usr/local/bin/

4.4准备认证文件

创建 bootstrap token 认证文件,apiserver 启动时会调用,然后就相当于在集群内创建了一个这个用户,接下来就可以用 RBAC 给他授权

cd /opt/k8s/
vim token.sh
#!/bin/bash
#获取随机数前16个字节内容,以十六进制格式输出,并删除其中空格
BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
#生成 token.csv 文件,按照 Token序列号,用户名,UID,用户组 的格式生成
cat > /opt/kubernetes/cfg/token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF
​
chmod +x token.sh
./token.sh

4.5开启 apiserver 服务

cd /opt/k8s/
vim apiserver.sh
./apiserver.sh 192.168.116.21 https://192.168.116.21:2379,https://192.168.116.22:2379,https://192.168.116.23:2379
​
​
检查进程是否启动成功
ps aux | grep kube-apiserver

4.6启动 controller-manager 服务

cd /opt/k8s/
vim controller-manager.sh
./controller-manager.sh
​
ps aux | grep kube-controller-manager

4.7启动 scheduler 服务

cd /opt/k8s/
vim scheduler.sh
./scheduler.sh
ps aux | grep kube-scheduler

4.8生成kubectl连接集群的kubeconfig文件

vim admin.sh
./admin.sh
​
绑定默认cluster-admin管理员集群角色,授权kubectl访问集群
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
判断master是否正常,就用
kubectl get cs

4.9查看客户端和服务端的版本号

kubectl version

5.部署 Worker Node 组件

5.1在所有 node 节点上操作

#创建kubernetes工作目录

mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}

上传 node.zip 到 /opt 目录中,解压 node.zip 压缩包,获得kubelet.sh、proxy.sh

cd /opt/
mkdir k8s 
cd k8s
​
上传node.zip
unzip node.zip
chmod +x kubelet.sh proxy.sh

5.2在 master01 节点上操作

把 kubelet、kube-proxy 拷贝到 node 节点

cd /opt/k8s/kubernetes/server/bin
scp kubelet kube-proxy node01:/opt/kubernetes/bin/
scp kubelet kube-proxy node02:/opt/kubernetes/bin/

上传kubeconfig.sh文件到/opt/k8s/kubeconfig目录中,生成kubelet初次加入集群引导kubeconfig文件和kube-proxy.kubeconfig文件

mkdir /opt/k8s/kubeconfig
cd /opt/k8s/kubeconfig
​
​
修改里面的配置
vim kubeconfig.sh
chmod +x kubeconfig.sh
​
./kubeconfig.sh 192.168.116.21 /opt/k8s/k8s-cert/

把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷贝到 node 节点

scp bootstrap.kubeconfig kube-proxy.kubeconfig node01:/opt/kubernetes/cfg/
scp bootstrap.kubeconfig kube-proxy.kubeconfig node02:/opt/kubernetes/cfg/

RBAC授权,使用户 kubelet-bootstrap 能够有权限发起 CSR 请求证书

kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap

5.3在 node01 节点上操作

启动 kubelet 服务

cd /opt/k8s/
chmod +x kubelet.sh
./kubelet.sh 192.168.116.22
​
查看是否启动成功
ps aux | grep kubelet

 

5.4在 master01 节点上操作,通过 CSR 请求

检查到 node01 节点的 kubelet 发起的 CSR 请求,Pending 表示等待集群给该节点签发证书

kubectl get csr

通过 CSR 请求

kubectl certificate approve node-csr-te9jUMtI8OmMwIojbc3YMMqwp8O20w1q5znPVg7kZvQ

Approved,Issued 表示已授权 CSR 请求并签发证书

查看节点,由于网络插件还没有部署,节点会没有准备就绪 NotReady

kubectl get node
​
进入node节点
查看证书
ls /opt/kubernetes/ssl

5.5在 node01 节点上操作

加载 ip_vs 模块

cd /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs
​
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
​
查看模块是否加载完成
cat /proc/net/ip_vs

启动proxy服务

cd /opt/
vim ./proxy.sh
​
./proxy.sh 192.168.80.11
ps aux | grep kube-proxy

5.6进入node02节点

cd /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs
​
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
​
查看模块是否加载完成
cat /proc/net/ip_vs
​

启动kubelet

cd /opt/k8s
​
vim kubelet.sh
​
./kubelet.sh 192.168.116.23
​
​
进入master节点
​
kubectl get csr
​
kubectl certificate approve node-csr-P7dmlFvwrB_FN7_769rPTIXpt8f-LsyTmS7UMYMBKkU
​
kubectl get csr
​
进入node节点
查看证书
ls /opt/kubernetes/ssl

启动proxy

cd /opt/k8s
vim proxy.sh
​
./proxy.sh 192.168.116.23
ps aux | grep proxy
​
进入master节点
kubectl get nodes

6.部署 CNI 网络组件

目前比较常用的时flannel和calico,flannel的功能比较简单,不具备复杂的网络策略配置能力,calico是比较出色的网络管理插件,但具备复杂网络配置能力的同时,往往意味着本身的配置比较复杂,所以相对而言,比较小而简单的集群使用flannel,考虑到日后扩容,未来网络可能需要加入更多设备,配置更多网络策略,则使用calico更好。

6.1部署 flannel

node01 节点上操作

上传flannel软件包到/opt/k8s

cd /opt/k8s
​
unzip flannel-v0.21.5.zip
docker load -i flannel-cni-plugin.tar
docker load -i flannel.tar


mkdir /opt/k8s/cni/bin
tar zxvf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin

将node01的k8s目录中的所有.tar文件包复制给node02节点里

cd /opt/k8s
scp *.tar 192.168.116.23:/opt/k8s

进入node02节点

docker load -i flannel-cni-plugin.tar
docker load -i flannel.tar
​
docker images

再将node01的插件目录复制到node02节点中

进入node01
cd /opt
scp -r cni/ 192.168.116.23:/opt

将node01的yml文件复制到master节点中

scp kube-flannel.yml 192.168.116.21:/opt/k8s

在master执行yml文件

kubectl apply -f kube-flannel.yml
会自动创建flannel所需要的资源
检查部署是否成功
kubectl get pods -n kube-flannel -owide
​
当显示node01和node02节点都为running时,即为部署成功 



此时使用kubectl get nodes查看
两个节点都为reday
此时k8s集群都为正常了

也会在每个安装了flannel插件的节点上自动生成一个flannel.1的一个接口

ifconfig

7.部署 CoreDNS

CoreDNS 是 K8S 默认的集群内部 DNS 功能实现,为 K8S 集群内的 Pod 提供 DNS 解析服务

在所有node节点上上传coredns的镜像

cd /opt/k8s
​
docker load -i coredns.tar

到master节点上上传配置文件

cd /opt/k8s
​
kubectl apply -f coredns.yaml
创建文件

 

检查coredns是否运行

kubectl get pods -n kube-system

8.多Master部署

到master节点里的配置文件中新增一台master节点地址

cd /opt/k8s/k8s-cert
vim k8s-cert.sh

 

8.1进入新的master节点做初始化操作

关闭防火墙
```
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
```
​
关闭selinux
```
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
```
​
关闭swap
```
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab 
```
​
根据规划设置主机名
```
hostnamectl set-hostname master02
su
​
```
在master添加hosts
```
cat >> /etc/hosts << EOF
192.168.116.21 master01
192.168.116.24 master02
192.168.116.22 node01
192.168.116.23 node02
EOF
修改完之后要在所有节点里设置
vim /etc/hosts
添加192.168.116.24 master02
​
​
​
调整内核参数
```
cat > /etc/sysctl.d/k8s.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF
​
sysctl --system
```
​
时间同步
```
yum install ntpdate -y
ntpdate time.windows.com
```

在master01的节点里把master02所需的配置文件发送过去

cd /opt
scp -r kubernetes/ /etcd/ master02:/opt

在master02节点里将传过去的原先的日志文件清空

cd /opt/kubernetes/logs
rm -rf *
​
cd /opt/etcd
rm -rf bin cfg

进入master01节点里将kube工具传给master02的家目录下

cd
scp -r .kube/ master02:/root
​
进入master02节点
ls -A
cd .kube
rm -rf cache/

进入master01节点

cd /usr/lib/systemd/system
scp kube-* master02:`pwd`
​
进入master02节点中去查看
ls /usr/lib/systemd/system/kube-*

修改master02启动的参数配置

cd /opt/kubernetes/cfg
vim kube-apiserver


vim kube-controller-manager


vim kube-scheduler

将程序都启动

systemctl enable kube-apiserver.service --now
systemctl enable kube-controller-manager.service --now
systemctl enable kube-scheduler.service --now
systemctl status kube-*

把bin目录中的二进制文件做个软连接

ln -s /opt/kubernetes/bin/* /usr/local/bin
​
检查各个node节点状态
kubectl get nodes
kubectl get cs

进入master查看证书

vim /opt/k8s/k8s-cert/k8s-cert.sh 
​
vip地址为192.168.116.200
两个负载均衡器的地址为14和15

准备好两台负载均衡,用nginx做负载均衡

192.168.116.14
192.168.116.15
​
systemctl stop firewalld
setenforce 0
​
cd /etc/yum.repos.d
上传nginx.repo包
​
yum install -y nginx
systemctl enable --now nginx

8.2使用四层代理做转发

先确认stream模块是否打开
nginx -V


cd /etc/nginx/
vim nginx.conf
​
在http上添加四层代理转发
​
stream {
    upstream k8s-apiservers {
        server 192.168.116.21:6443;
        server 192.168.116.24:6443;
 }
​
    server {
           listen 6443;
           proxy_pass k8s-apiservers;
    }
}
​
​
检查语法结构
nginx -t
systemctl restart nginx
​
​
至此nginx负载均衡已经准备好了

两台负载均衡 准备keepalived

yum install -y keepalived.x86_64

在192.168.116.14节点准备一个脚本文件

cd /etc/keepalived/
​
vim check_nginx.sh
​
#!/bin/bash
if ! killall -0 nginx
  then
  systemctl stop keepalived
fi

修改keepalived配置文件

vim keepalived.conf
​
​
! Configuration File for keepalived
​
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id NGINX_01
}
​
vrrp_scipt check_nginx {
    interval 2
    script "/etc/keeplived/check_nginx.sh"
}
​
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.116.200
    }
    track_script {
      check_nginx
    }
}
​
systemctl enable --now keepalived.service
--------------------------------------------------------------------
检查是否有VIP地址
ip addr
scp * 192.168.116.15:`pwd`

然后将修改好的配置文件复制给192.168.116.15

scp * 192.168.116.15:`pwd`

进入192.168.116.15,修改keepalived.conf文件

cd /etc/keepalived/
vim keepalived.conf
​
​
! Configuration File for keepalived
​
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   } 
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id NGINX_02
}  
​
vrrp_scipt check_nginx {
    interval 2
    script "/etc/keeplived/check_nginx.sh"
}   
​
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        192.168.116.200
    }   
    track_script {
      check_nginx
    } 
}   
​
​
systemctl enable --now keepalived.service

8.3修改node节点上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件为VIP

cd /opt/kubernetes/cfg
-------------------------------------------
vim bootstrap.kubeconfig
server: https://192.168.116.200:6443
-------------------------------------------
vim kube-proxy.kubeconfig 
server: https://192.168.116.200:6443
-------------------------------------------
vim kubelet.kubeconfig
server: https://192.168.116.200:6443

8.4两台node节点重启kubelet和kube-proxy服务

systemctl restart kubelet.service kube-proxy.service

在负载均衡服务器上查看 nginx 和 node 、 master 节点的连接状态

netstat -natp | grep nginx

在master02上进行操作

cd /opt/kubernetes/cfg
​
--------------------------------------------------------------
vim kube-scheduler.kubeconfig
server: https://192.168.116.24:6443
-------------------------------------------------------------
vim kube-controller-manager.kubeconfig
server: https://192.168.116.24:6443
​
​
重启服务
systemctl restart kube-controller-manager.service  kube-scheduler.service

到此k8s多Master集群已完成搭建

总结

1.部署etcd

使用cfssl工具签发证书和私钥文件 解压etcd软件包,获取二进制文件 etcd etcdctl 准备etcd集群配置文件 启动etcd进程服务,将所有节点加入到etcd集群中

etcd的操作:
#查看etcd集群健康状态
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379,https://IP2:2379,https://IP3:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 -wtable endpoint health
​
#查看etcd集群状态信息
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379,https://IP2:2379,https://IP3:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 -wtable endpoint status
​
#查看etcd集群成员列表
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379,https://IP2:2379,https://IP3:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 -wtable member list
​
#向etcd插入键值
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 put <KEY> '<VALUE>'
​
#查看键的值
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 get <KEY>
​
#删除键
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 del <KEY>
​
#备份etcd数据库
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 snapshot save 备份文件路径
​
#恢复etcd数据库
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 snapshot restore 备份文件路径

2.部署master组件

  1. 使用cfssl工具签发证书和私钥文件

  2. 下载K8S软件包,获取二进制文件 kube-apiserver kube-controller-manager kube-scheduler

  3. 准备 kube-apiserver 启动时要调用的 bootstrap-token 认证文件(token.csv)

  4. 准备 kube-apiserver kube-controller-manager kube-scheduler 的进程服务启动参数配置文件

  5. 准备 kube-controller-manager kube-scheduler kubectl 的 kubeconfig 集群引导配置文件(用于连接和验证 kube-apiserver)

  6. 依次启动 kube-apiserver kube-controller-manager kube-scheduler 进程服务

  7. 执行 kubectl get cs 命令查看master组件的健康状态

3.部署node组件

  1. 获取二进制文件 kubelet kube-proxy

  2. 准备 kubelet kube-proxy 使用的 kubeconfig集群引导配置文件 bootstrap.kubeconfig(kubelet首次访问apiserver使用认证的文件) kube-proxy.kubeconfig

  3. 准备 kubelet kube-proxy 的进程服务启动参数配置文件

  4. 启动 kubelet 进程服务,向 apiserver 发起 CSR 请求自动签发证书,master 通过 CSR 请求后 kubelet 即可获取到证书

  5. 加载 ipvs 模块,启动 kube-proxy 进程服务

  6. 安装 cni 网络插件(flannel或calico)和 CoreDNS

  7. 执行 kubectl get nodes 命令查看node节点状态

4.部署多master高可用

  1. 负责master组件相关的二进制文件、证书、私钥、启动参数配置文件、kubeconfig集群引导配置文件和etcd的证书、私钥文件

  2. 修改 kube-apiserver kube-controller-manager kube-scheduler 启动参数配置文件里的监听地址和通告地址,再依次重启服务进程

  3. 部署 nginx/haproxy 负载均衡器和 keepalived 高可用

  4. 修改 kubelet kube-proxy kubectl 的kubeconfig集群引导配置文件里的server参数都指向keepalived的VIP地址,再重启 kubelet kube-proxy 服务进程

  5. 修改其它master节点上的 kube-controller-manager kube-scheduler 的kubeconfig集群引导配置文件里的server参数都指向各自本机的apiserver地址,再重启服务进程

<think>我们注意到用户的问题集中在“如何使用Helm进行二进制部署”。然而,根据引用内容,Helm通常用于在Kubernetes中部署容器化的应用,而不是直接部署二进制文件。二进制部署通常指的是在主机上直接运行可执行文件,而不是通过容器。因此,我们需要澄清概念并给出正确的指导。 用户引用的内容中提到了多种部署方式,包括二进制部署、docker部署k8s部署和helm部署。其中,helm部署是在Kubernetes上使用Helm图表来部署应用(通常以容器形式)。因此,严格来说,Helm并不直接用于二进制部署。 但是,我们可以考虑一种混合场景:在Kubernetes集群中,有些节点可能需要以二进制方式运行某些服务(例如,出于性能考虑),而同时我们又希望用Helm来管理这些二进制部署的服务。这通常不是Helm的标准用法,但我们可以通过自定义Helm图表来实现对二进制部署的管理(例如,通过创建DaemonSet或StatefulSet来部署包含二进制文件的镜像,或者使用Helm来生成配置和启动脚本,然后通过其他工具如Ansible在主机上执行)。 不过,更常见的是,Helm用于部署容器化的应用。如果用户希望将二进制文件打包到容器中,然后通过Helm部署,那么这实际上是容器化部署,而不是传统意义上的二进制部署。 因此,我们需要分两种情况讨论: 1. 使用Helm在Kubernetes中部署容器化的应用(其中容器内运行的是二进制文件)。 2. 使用Helm来管理非容器化的二进制部署(即直接在主机上运行二进制文件,但通过Helm来管理配置和部署流程)——这需要自定义解决方案。 根据引用[1]中提到的“k8s helm 部署nacos”,我们可以推断用户可能是在Kubernetes环境中使用Helm来部署Nacos,而Nacos可以是容器化的。因此,我们重点放在第一种情况:使用Helm在Kubernetes中部署包含二进制文件的容器。 步骤: 1. 准备一个Docker镜像,该镜像包含要运行的二进制文件。 2. 创建Helm图表,其中定义Deployment、StatefulSet等资源,并在容器中运行该二进制文件。 3. 通过Helm安装或升级该图表。 然而,如果用户确实需要在主机上直接二进制部署(非容器化),那么我们可以通过Helm图表生成配置文件和部署脚本,然后配合其他工具(如Ansible)在主机上执行这些脚本。但这种方式不是Helm的原生用法。 鉴于引用[1]中提供了helm部署nacos的示例,我们可以参考其步骤来说明如何使用Helm在Kubernetes中部署应用(容器化)。 以下我们将以部署Nacos为例,说明如何使用Helm进行部署(容器化部署,但容器内运行的是二进制程序,这实际上是一种二进制文件在容器内运行的方式)。 步骤: 1. 克隆Nacos Helm图表的项目(如引用[1]所述)。 2. 修改values.yaml配置文件。 3. 使用helm install命令部署。 但是,用户的问题是如何使用Helm进行二进制部署。如果这里的“二进制部署”指的是在容器内运行二进制文件,那么上述步骤就是答案。如果指的是在主机上直接运行二进制文件,那么我们需要使用其他方法。 为了明确,我们首先澄清: - 在容器内运行二进制:这是容器化部署,通过Helm部署Kubernetes工作负载(如Pod)来运行包含二进制的容器镜像。 - 在主机上直接运行二进制:这通常需要将二进制文件复制到主机,并配置系统服务(如systemd)。Helm本身不直接支持这种部署,但我们可以通过Helm生成配置和脚本,然后借助其他工具(如Ansible)执行。 由于引用[1]中提到的helm部署nacos都是运行在容器内的,所以我们按照容器化部署来解释。 具体步骤(以Nacos为例): 1. 克隆项目(如引用[1]所述): ```bash git clone https://github.com/nacos-group/nacos-k8s.git ``` 2. 创建数据库(如果Nacos配置了使用外部数据库): 需要手动创建数据库,并导入表结构。 3. 修改values.yaml文件: 在克隆的项目中,进入helm目录,修改values.yaml文件,例如设置数据库连接信息、副本数等。 4. 使用Helm安装: ```bash # 单机模式 helm install nacos ./nacos-k8s/helm -n nacos --create-namespace # 集群模式 helm install nacos-cluster ./nacos-k8s/helm -f values-cluster.yaml -n nacos ``` 但是,如果用户希望的是在主机上直接运行二进制文件,我们可以这样考虑(虽然不常用): 1. 创建一个Helm图表,其中包含ConfigMap,用于存储启动脚本和配置文件。 2. 创建DaemonSet或使用HostPath卷,将二进制文件挂载到主机(但需要提前将二进制文件放在主机上,或者使用init容器下载)。 3. 使用DaemonSet或StatefulSet来运行一个容器,该容器通过hostPath将脚本挂载到主机,然后通过特权容器在主机上执行该脚本(启动二进制程序)。但这种方法安全性较低,且复杂。 因此,我们通常推荐将二进制文件打包到容器镜像中,然后通过Helm部署容器。 总结回答: 用户可能混淆了概念。Helm主要用于Kubernetes应用的部署,而应用通常以容器形式运行。如果应用是二进制文件,我们可以将其构建到容器镜像中,然后通过Helm部署该镜像。真正的二进制部署(主机直接运行)通常不通过Helm完成,而是通过配置管理工具。 因此,我们给出两种场景的解决方案: 场景1:容器化部署(推荐) 步骤: 1. 构建包含二进制文件的Docker镜像。 2. 创建Helm图表,定义Deployment/DaemonSet/StatefulSet等资源。 3. 在图表中指定容器镜像为步骤1构建的镜像。 4. 使用Helm安装或升级图表。 场景2:非容器化部署(直接主机运行) 1. 使用Ansible等工具将二进制文件分发到主机。 2. 使用Helm生成配置文件(通过ConfigMap),然后由Ansible将配置文件分发到主机。 3. 使用Ansible在主机上创建systemd服务并启动。 4. 或者,在Helm图表中定义Job,该Job通过特权容器在主机上执行部署脚本(不推荐,因为需要特权且复杂)。 由于引用中提供的都是容器化部署的示例,我们建议用户采用场景1。 下面以Nacos为例,展示如何使用Helm在Kubernetes中部署(容器化): 步骤1:克隆Nacos的Helm图表项目 ```bash git clone https://github.com/nacos-group/nacos-k8s.git cd nacos-k8s/helm ``` 步骤2:修改values.yaml,例如设置数据库(如果使用MySQL) ```yaml # 使用外部数据库 nacos: db: host: "mysql-host" port: 3306 username: "nacos" password: "nacos" dbName: "nacos" ``` 步骤3:安装Helm图表(单机模式) ```bash helm install nacos . -n nacos --create-namespace ``` 步骤4:验证 ```bash kubectl get pods -n nacos ``` 对于集群模式,可以在values.yaml中设置replicaCount,并确保使用共享存储(如数据库)或者嵌入式数据库的共享存储(需要配置持久卷)。 注意:引用[1]中提到的helm部署nacos的步骤中,需要创建数据库和导入表结构,这是在使用外部数据库时必须的。 因此,回答用户的问题:Helm通常不直接用于传统意义上的二进制部署(主机直接运行),而是用于在Kubernetes中部署容器化应用。如果应用是二进制的,我们将其放入容器镜像中,然后通过Helm部署该镜像。 如果用户坚持要在主机上直接运行二进制文件,同时还想用Helm管理,那么我们可以设计一个方案,但这不是标准做法: 1. 在Helm图表中定义ConfigMap,包含启动脚本和配置文件。 2. 使用DaemonSet,通过hostPath挂载主机目录,并运行一个初始化容器,将二进制文件(或从网上下载)和ConfigMap中的配置复制到主机目录。 3. 在DaemonSet中运行一个容器,通过nsenter或ssh在主机上执行启动脚本(这需要特权且不安全)。 因此,我们不推荐这种方式,而推荐容器化部署。 最后,我们根据引用[1]的内容,强调helm部署nacos实际上是容器化部署,不是主机上的二进制部署。 相关问题: 1. 如何构建包含二进制文件的Docker镜像? 2. 如何为Helm图表配置持久化存储? 3. 使用Helm部署时如何管理敏感信息(如数据库密码)? 4. 如何升级通过Helm部署二进制应用?</think>根据引用内容,Helm 本身是 Kubernetes 的包管理工具,主要用于部署容器化应用。**严格来说,Helm 不直接支持二进制部署**,但可以通过组合方案实现混合部署。以下是具体实现方法: --- ### 一、Helm 管理二进制部署的核心思路 1. **Helm 的角色** 通过 Helm Chart 统一管理: - 二进制文件的下载路径 - 主机目录挂载配置 - 系统服务配置(systemd 单元文件) - 依赖环境配置(如 JRE) 2. **二进制部署的实现** 使用 Kubernetes 的 `DaemonSet` + `hostPath` 卷,将二进制文件直接部署到节点: ```yaml # values.yaml 片段 binary: downloadURL: "https://example.com/app-v1.0.0-linux-amd64.tar.gz" installPath: "/opt/myapp/bin" hostPath: "/usr/local/bin" # 主机二进制安装路径 ``` --- ### 二、Helm 实现二进制部署全流程(以 Nacos 为例) #### 1. 创建 Helm Chart 结构 ```bash helm create binary-deploy cd binary-deploy tree . # 结果 ├── Chart.yaml ├── values.yaml ├── templates/ │ ├── daemonset.yaml # 部署二进制到所有节点 │ ├── configmap.yaml # 存储安装脚本 │ └── service.yaml # 暴露服务 ``` #### 2. 配置安装脚本模板(templates/configmap.yaml) ```yaml apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-install-script data: install.sh: | #!/bin/bash wget {{ .Values.binary.downloadURL }} -O /tmp/app.tar.gz tar -zxvf /tmp/app.tar.gz -C {{ .Values.binary.installPath }} chmod +x {{ .Values.binary.installPath }}/app # 创建 systemd 服务(参考引用[1]) echo "[Unit] Description=My Binary App [Service] ExecStart={{ .Values.binary.hostPath }}/app Restart=always [Install] WantedBy=multi-user.target" > /etc/systemd/system/myapp.service systemctl daemon-reload systemctl enable myapp ``` #### 3. 配置 DaemonSet(templates/daemonset.yaml) ```yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: {{ .Release.Name }}-binary-installer spec: selector: matchLabels: app: binary-installer template: metadata: labels: app: binary-installer spec: hostPID: true hostNetwork: true containers: - name: installer image: alpine:3.14 command: ["/bin/sh", "-c", "chmod +x /scripts/install.sh && /scripts/install.sh && sleep infinity"] volumeMounts: - name: install-script mountPath: /scripts - name: host-fs mountPath: /host mountPropagation: HostToContainer volumes: - name: install-script configMap: name: {{ .Release.Name }}-install-script - name: host-fs hostPath: path: / type: Directory ``` #### 4. 部署与验证 ```bash helm install my-binary-app . -f values.yaml # 检查节点上的二进制文件 kubectl exec daemonset/<daemonset-name> -- ls {{ .Values.binary.hostPath }} # 检查服务状态 kubectl exec daemonset/<daemonset-name> -- systemctl status myapp ``` --- ### 三、关键配置说明 1. **hostPath 挂载** 通过 `mountPropagation: HostToContainer` 使容器内操作直接作用于主机文件系统[^1] 2. **安全隔离** 建议添加: ```yaml securityContext: privileged: false readOnlyRootFilesystem: true ``` 3. **升级机制** 修改 values.yaml 中的下载 URL 后执行: ```bash helm upgrade my-binary-app . -f values.yaml ``` --- ### 四、与容器化部署的对比 | **能力** | Helm 二进制部署方案 | Helm 标准容器部署 | |-------------------|----------------------------------|---------------------------| | 部署目标 | 直接部署到主机文件系统 | Kubernetes Pod 内 | | 资源占用 | 极低(无容器运行时开销) | 较高(需容器运行时) | | 适用场景 | 性能敏感型服务(如数据库) | 微服务应用 | | 隔离性 | 弱(共享主机内核) | 强(容器隔离) | | 升级回滚 | 通过 Helm 管理脚本版本 | 原生支持镜像版本回滚 | > 💡 **最佳实践**:对性能要求极高的组件(如 etcd、Prometheus)使用此方案,其他组件用标准容器部署[^3] --- ### 五、典型问题解决 1. **文件权限问题** 在 install.sh 中添加: ```bash chown root:root {{ .Values.binary.hostPath }}/app chmod 0750 {{ .Values.binary.hostPath }}/app ``` 2. **依赖管理** 在 values.yaml 定义依赖包: ```yaml dependencies: - name: jdk repository: https://example.com/helm-repo version: 11.0.18 ``` 3. **多架构支持** 使用节点标签选择器: ```yaml nodeSelector: kubernetes.io/arch: amd64 # 或 arm64 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值