【linux】搭建3主2从kubernetes(k8s)集群

1、kubernetes 功能简介

  • 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器, 如果进入容器的流量很大,  Kubernetes 可以负载均衡并分配网络流量, 从而使部署稳定. 常用的DNS插件为coreDNS, 用作服务发现和集群中容器通讯; 负载均衡器常使用集群内的service资源进行对外暴露服务, 同时也提供ingress插件接口对外暴露服务

  • 存储编排 Kubernetes 允许你自动挂载你选择的存储系统, 例如本地存储、公共云提供商等. 对于集群内部的应用有时会需要持久化数据, 这时容器如果被删除数据也会随之消失, 所以一个稳定的外部存储集群就显得很重要了; 常见的对k8s提供存储能力的集群有: heketi + gluesterfs 、Rook + Ceph、阿里云OSS等, 配合集群内的storageclass可直接向存储集群申请存储空间

  • 自动部署和回滚 你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态 更改为期望状态. 例如, 你可以自动化 Kubernetes 来为你的部署创建新容器,  删除现有容器并将它们的所有资源用于新容器. 控制k8s集群中容器的状态大多数时候都会采用 yaml 资源配置清单的形式, 方便记忆也易于识别

  • 自动完成装箱计算 Kubernetes 允许你指定每个容器所需 CPU 和内存(RAM).  当容器指定了资源请求时, Kubernetes 可以做出更好的决策来管理容器的资源. 这就与Linux操作系统中的资源限额有关系了, 有些容器在接收高并发访问的时候, 往往会无限制的占用宿主机资源, 从而导致其他服务容器争抢不到应有的资源进行运行和服务, 从而导致大面积瘫痪

  • 自我修复 Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的 运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端. 在创建pod的时候, 只有当设置在pod中的探针全部探测正常后才会将pod连接到集群内网络中对外进行服务, 否则将通过监控告警给运维人员; 同样的对于k8s中的容器会受到kubelet和kube-apiserver的双重管理, kubelet上报容器运行状态, api-server向etcd中请求期望状态, 比较后让其达到期望的状态, 从而保证其功能/服务容器永久保持在线

  • 密钥与配置管理 Kubernetes 允许你存储和管理敏感信息, 例如密码、OAuth 令牌和 ssh 密钥.  你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置, 也无需在堆栈配置中暴露密钥. 对于无状态应用(exam: nginx)的配置文件, 可以使用k8s中的configmap资源进行存储, 但对于密码和某些私密信息而言就可以使用secret资源进行存储, 从而避免频繁更改和私密信息泄漏的风险

1.1、集群部署方式

方式1. minikube

Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用。不能用于生产环境。

官方地址:https://kubernetes.io/docs/setup/minikube/

方式2. kubeadm

Kubeadm也是一个工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。

官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

方式3. 直接使用epel-release yum源,缺点就是版本较低 1.5

方式4. 二进制包

2、环境准备[集群]

[集群]为在所有节点上配置,[master]为在所有master节点上配置

1、配置本地解析

cat >> /etc/hosts << EOF
192.168.75.171   kub-master1
192.168.75.172   kub-master2
192.168.75.173   kub-master3
192.168.75.174   kub-node1
192.168.75.175   kub-node2
EOF

2、修改主机名

例:hostnamectl set-hostname kub-master1

3、同步时间

timedatectl set-timezone Asia/Shanghai
yum install -y ntpdate
ntpdate time.windows.com

4、关闭防护墙、selinux

systemctl disable firewalld --now

编辑文件/etc/selinux/config,将SELINUX修改为disabled,如下:
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux

5、关闭swap分区

swapoff -a

sed -i 's/.*swap.*/#&/' /etc/fstab
 

6、配置静态ip地址

3、安装docker[集群]

Step 1: 安装必要的一些系统工具

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

Step 2: 添加软件源信息

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

Step 3:

sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

Step 4: 更新并安装Docker-CE

sudo yum makecache fast

sudo yum -y install docker-ce

Step 5: 开启Docker服务

sudo service docker start

4、阿里仓库下载[集群]

在线下载

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.22.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.22.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.22.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.22.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.4
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.0-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.5

# 下载完了之后需要将aliyun下载下来的所有镜像打成k8s.gcr.io/kube-controller-manager:v1.22.0这样的tag
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.22.0 k8s.gcr.io/kube-controller-manager:v1.22.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.22.0 k8s.gcr.io/kube-proxy:v1.22.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.22.0 k8s.gcr.io/kube-apiserver:v1.22.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.22.0 k8s.gcr.io/kube-scheduler:v1.22.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.4 k8s.gcr.io/coredns/coredns:v1.8.4
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.0-0 k8s.gcr.io/etcd:3.5.0-0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.5 k8s.gcr.io/pause:3.5  
 

# 可以清理掉aliyun的镜像标签
docker rmi -f `docker images --format {{.Repository}}:{{.Tag}} | grep aliyun`

离线安装[适用于当前网络环境不佳的情况],直接将包导入

ls
anaconda-ks.cfg  application.tar.xz  kube-1.22.0.tar.xz
tar xvf application.tar.xz  
tar xvf kube-1.22.0.tar.xz 


解压完后cd进去sh执行脚本 

5、安装Kubeadm包[集群]

配置官方源[需翻墙]
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

配置阿里云源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

所有节点:

1.安装依赖包及常用软件包
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git iproute lrzsz bash-completion tree bridge-utils unzip bind-utils gcc


2.安装对应版本
# yum install -y kubelet-1.22.0-0.x86_64 kubeadm-1.22.0-0.x86_64 kubectl-1.22.0-0.x86_64

3.加载ipvs相关内核模块
cat <<EOF > /etc/modules-load.d/ipvs.conf 
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack_ipv4
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF

4.配置:
配置转发相关参数,否则可能会出错

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF

5.使配置生效
sysctl --system

!!!配置完成后重启服务器

5.1 配置启动kubelet[集群]

配置变量:
DOCKER_CGROUPS=`docker info |grep 'Cgroup' | awk ' NR==1 {print $3}'`
 

2.配置kubelet的cgroups
cat >/etc/sysconfig/kubelet<<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=$DOCKER_CGROUPS --pod-infra-container-image=k8s.gcr.io/pause:3.5"
EOF

5.2  启动

systemctl daemon-reload
systemctl enable kubelet && systemctl restart kubelet

5.3  配置master节点[master]

5.3.1 和5.3.2 所有master都执行,5.3.3 只有master1执行

5.3.1、安装haproxy(也可以选择lvs、nginx等 )

yum install -y haproxy

vim /etc/haproxy/haproxy.cfg

# Global settings section
global
    log         127.0.0.1 local2     # 设置日志记录,使用本地系统日志服务

    chroot      /var/lib/haproxy     # 设置 HAProxy 的运行环境为隔离模式
    pidfile     /var/run/haproxy.pid # 指定 HAProxy 进程的 PID 文件位置
    maxconn     4000                 # 设置最大并发连接数
    user        haproxy              # 指定 HAProxy 运行的用户
    group       haproxy              # 指定 HAProxy 运行的用户组
    daemon                           # 以守护进程模式运行

    # 开启状态统计的 UNIX 套接字
    stats socket /var/lib/haproxy/stats

# Default settings section
defaults
    mode                    tcp      # 默认使用 TCP 模式,适用于非 HTTP 流量
    log                     global   # 使用全局日志设置
    option                  tcplog   # 开启 TCP 日志记录
    timeout connect         10s      # 连接超时设置
    timeout client          1m       # 客户端超时
    timeout server          1m       # 服务器超时
    retries                 3        # 连接重试次数

frontend stats
    mode http
    bind *:9000                # 监听 9000 端口,用于访问统计页面
    stats enable               # 启用统计报告
    stats uri /haproxy_stats   # 设置统计报告的 URI,可以通过 http://<your-ip>:9000/haproxy_stats 访问
    stats realm HAProxy\ Statistics  # 设置认证弹窗的标题
    stats auth admin:password  # 设置访问统计页面的用户名和密码,这里为 admin 和 password,您应该设置一个更安全的密码
    stats admin if TRUE        # 如果设置为 TRUE,允许在页面上进行管理操作

# Kubernetes Master 节点的前端配置
frontend kubernetes-frontend
    bind *:6443                        # 监听 8443 端口,用于 Kubernetes API
    default_backend kubernetes-backend # 默认后端设置为 kubernetes-backend

# Kubernetes Master 节点的后端配置
backend kubernetes-backend
    balance roundrobin                 # 使用轮询算法进行负载均衡
    option tcp-check                   # 开启 TCP 检查以检测服务器健康状态
    server master1 kub-master1:6443 check # Kubernetes Master 节点1
    server master2 kub-master2:6443 check # Kubernetes Master 节点2
    server master3 kub-master3:6443 check # Kubernetes Master 节点3

启动haproxy

systemctl start haproxy

5.3.2、配置keepalived

yum install -y keepalived

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id directory1   # master2、3修改为directory2,directory3
}

vrrp_instance VI_1 {
    state MASTER   # master2、3修改为BACKUP
    interface ens33
    virtual_router_id 80
    priority 100      # master2、3修改优先级,比100低,三个不同就行
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.75.180/24  # 网段的vip,也是 3 初始化步骤中的 --control-plane-endpoint
    }
}

启动并开机启动

systemctl enable --now keepalived

5.3.3、初始化集群

注意事项:

  • 1、--control-plane-endpoint "192.168.75.180:8443" 指的是vip的地址和haproxy的端口

  • 2、--pod-network-cidr=10.244.0.0/16 可以默认,如果修改,所有pod的网段均会修改

  • 3、--apiserver-advertise-address=192.168.75.171 指的是当前master1 的ip地址

  • 4、--apiserver-cert-extra-sans=后面指的是所有master的ip和vip地址

运行初始化过程如下:
kubeadm init --kubernetes-version=v1.22.0 --control-plane-endpoint "192.168.75.180:8443" --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.75.171 --apiserver-cert-extra-sans=192.168.75.180,192.168.75.171,192.168.75.172,192.168.75.102,192.168.75.173 --upload-certs

初始化结束最后会出现下面代码

You can now join any number of the control-plane node running the following command on each as root:
  # 其他master节点执行
  kubeadm join 192.168.75.180:8443 --token hxyvvg.bzvpv2h1ag28g79m \
        --discovery-token-ca-cert-hash sha256:19a140207276157f923d7f962b5a51e93006f282180b439ad5c1390acaea722c \
        --control-plane --certificate-key 1d241f4bdfbfb37444221397b0e3522c8096f54d4b301cc49b69ddc735bee9c1

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:
 # 其他node节点执行
kubeadm join 192.168.75.180:8443 --token hxyvvg.bzvpv2h1ag28g79m \
        --discovery-token-ca-cert-hash sha256:19a140207276157f923d7f962b5a51e93006f282180b439ad5c1390acaea722c 

# master 执行配置
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看node节点

kubectl get nodes

5.4  配置使用网络插件[master]

curl -L https://docs.projectcalico.org/v3.22/manifests/calico.yaml -O

 kubectl apply -f  calico.yaml

kubectl get pod -A -w

所有节点状态应为Ready
kubectl get node

5.5  集群数据库相关操作

kubernetes命令自动补全
yum install -y epel-release bash-completion
source /usr/share/bash-completion/bash_completion
echo "source <(kubectl completion bash)" >> ~/.bashrc

#即可补全命令

  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值