ECS自建K8S集群

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 目前在创建Kubernetes集群时,存在着使用很多小规格ECS的现象,这样做有以下弊端:

**一、概述(官方建议)

集群规划**
目前在创建Kubernetes集群时,存在着使用很多小规格ECS的现象,这样做有以下弊端:
小规格Woker ECS的网络资源受限。
如果一个容器基本可以占用一个小规格ECS,此ECS的剩余资源就无法利用(构建新的容器或者是恢复失败的容器),在小规格ECS较多的情况下,存在资源浪费。
使用大规格ECS的优势:
网络带宽大,对于大带宽类的应用,资源利用率高。
容器在一台ECS内建立通信的比例增大,减少网络传输。
拉取镜像的效率更高。因为镜像只需要拉取一次就可以被多个容器使用。而对于小规格的ECS拉取镜像的次数就会增多,若需要联动ECS伸缩集群,则需要花费更多的时间,反而达不到立即响应的目的。
选择Master节点规格
通过容器服务创建的Kubernetes集群,Master节点上运行着etcd、kube-apiserver、kube-controller等核心组件,对于Kubernetes集群的稳定性有着至关重要的影响,对于生产环境的集群,必须慎重选择Master规格。Master规格跟集群规模有关,集群规模越大,所需要的Master规格也越高。
说明 您可从多个角度衡量集群规模,例如节点数量、Pod数量、部署频率、访问量。这里简单的认为集群规模就是集群里的节点数量。
对于常见的集群规模,可以参见如下的方式选择Master节点的规格(对于测试环境,规格可以小一些。下面的选择能尽量保证Master负载维持在一个较低的水平上)。

图片.png

选择Worker节点规格
ECS规格要求:CPU大于等于4核,且内存大于等于8 GiB。
确定整个集群的日常使用的总核数以及可用度的容忍度。
例如:集群总的核数有160核,可以容忍10%的错误。那么最小选择10台16核ECS,并且高峰运行的负荷不要超过16090%=144核。如果容忍度是20%,那么最小选择5台32核ECS,并且高峰运行的负荷不要超过16080%=128核。这样就算有一台ECS出现故障,剩余ECS仍可以支持现有业务正常运行。
确定CPU:Memory比例。对于使用内存比较多的应用例如Java类应用,建议考虑使用1:8的机型。

**
此次项目资源分配(数据库、中间件、镜像仓库Harbor除外):(在原有的开发测试服务器上搭建)**

图片.png

阿里云踩坑记录
图片.png

架构方案
图片.png

二、系统准备工作

所有机器配置好如下环境:
• 关闭防火墙,selinux
systemctl stop firewalld && systemctl disable firewalld
• 做好解析
cat >> /etc/hosts << EOF
192.168.10.11 k8s-master-01
192.168.10.12 k8s-master-02
192.168.10.21 k8s-work-01
192.168.10.22 k8s-work-02
192.168.10.100 k8s-vip
EOF

• 配置好时间同步
yum -y install vim curl wget unzip ntpdate net-tools ipvsadm ipset sysstat conntrack libseccomp
ntpdate ntp1.aliyun.com && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
• 禁用swap分区
swapoff -a && sed -i '/ swap / s/^(.*)$/#\1/g' /etc/fstab
• 配置内核参数
cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
fs.file-max=2000000
fs.nr_open=2000000
fs.inotify.max_user_instances=512
fs.inotify.max_user_watches=1280000
net.netfilter.nf_conntrack_max=524288
EOF
modprobe br_netfilter && sysctl -p /etc/sysctl.d/kubernetes.conf
• 加载ipvs模块:
yum install ipset ipvsadm -y
cat > /etc/sysconfig/modules/ipvs.modules <<EOF

!/bin/bash

modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules
sh /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_
•升级内核(版本较新的不需要此步)
[root@master1 ~]# yum -y update kernel
[root@master1 ~]# shutdown -r now
•安装nfs文件共享(可选)
yum -y install nfs-common nfs-utils rpcbind
systemctl start nfs && systemctl enable nfs
systemctl start rpcbind && systemctl enable rpcbind

三、部署过程

  1. 安装配置docker # 所有节点
  2. 安装软件 # 所有节点
  3. 安装负载均衡及高可用 # 所有 Master节点 使用阿里云的SLB
  4. 初台化Master1 # Master1节点
  5. 加入Master节点 # 其它 Master节点
  6. 加入Worker节点 # 所有 Node节点
  7. 配置kubectl # 所有需要的节点
  8. 部署网络插件 # Master1节点

3.1 安装配置docker

在所有节点安装
vim docker_install.sh

/bin/bash

curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
[ ! -d /etc/docker ] && mkdir /etc/docker
[ ! -d /data/docker ] && mkdir -p /data/docker
cat > /etc/docker/daemon.json <<- EOF
{

"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
    "max-size": "100m",
    "max-file": "3"
},
"storage-driver": "overlay2",
"storage-opts": [
    "overlay2.override_kernel_check=true"
],
"data-root": "/data/docker",
"max-concurrent-downloads": 5,
"storage-driver": "overlay2",
"registry-mirrors": [
    "https://pf5f57i3.mirror.aliyuncs.com",
    "http://harbor.xhyun.vip:81"
]

}
EOF
systemctl enable --now docker

bash docker_install.sh
3.2 安装软件
在所有节点安装
cat >> /etc/yum.repos.d/kubernetes.repo << EOF
[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
yum install -y kubeadm-1.18.10-0 kubelet-1.18.10-0 kubectl-1.18.10-0 ipvsadm
可用 yum list --showduplicates|egrep kubeadm 查看有哪些可用版本
设置开机启动kubelet

systemctl enable kubelet

2.3 安装负载均衡

在所有Master节点操作
Kubernetes master 节点运行如下组件:

  • kube-apiserver
  • kube-scheduler
  • kube-controller-manager

由于阿里云的VIP需要申请havip,暂且使用阿里云的SLB,所以不需要keepalived

在所有k8s-haproxy节点操作(方案二)
Haproxy

mkdir -p /data/k8s/haproxy-etc
vim /data/k8s/haproxy-etc/haproxy.cfg
globaz

daemon
maxconn 65535

defaults

mode http
timeout connect 5000ms
timeout client 5000ms
timeout server 5000ms

listen stats

mode http 
bind 0.0.0.0:8442
stats enable 
log global 
stats uri /haproxy-status 
stats auth haadmin:123456

listen k8s-control-plane

bind  0.0.0.0:8443
mode  tcp
log global
balance  roundrobin
option  tcplog
server  dev         172.18.215.10:6333 check weight 1 maxconn 2000
server  devmaster2  172.18.215.15:6333 check weight 1 maxconn 2000

docker run -d \

--name k8s-haproxy \
--restart=unless-stopped \
    --net=host \cd 
-v /data/k8s/haproxy-etc:/usr/local/etc/haproxy:ro \
haproxy:2.4.1-alpine

3.4 初始化master1
任选一台master节点,修改当前master节点 /etc/hosts,把 k8sapi 对应解析地址修改为当前节点地址(系统初始化时我们统一配置成slb负载地址了)。
对于四层监听的后端服务器无法访问私网SLB问题,是由于目前负载均衡不支持同时作为客户端和服务端,因为SLB tcp协议监听,是直接转发客户端IP和连接给后端ECS,当后端ECS连接SLB端口,SLB转发该连接时,后端ECS“看到”数据包是来自自己的IP,回包就不会回给SLB了,无法正常建立连接,所以telnet会不通。
而ECS可以telnet 公网SLB端口,是因为使用的是ECS的公网IP,VPC ECS的公网IP是在网络层映射到ECS的内网IP上的,ECS内部并没有该公网IP,所以可以telnet通公网SLB的端口
注意:因为是正式环境,我们尽量修改一些默认值,比如:token、apiserver端口、etcd数据路径、podip网段等。
在 Master1上创建初始化配置文件
mkdir k8s && cd k8s/ && kubeadm config print init-defaults > init.yml
根据实际环境修改初始化配置文件
vim init.yml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:

  • groups:

    • system:bootstrappers:kubeadm:default-node-token

    token: abcdef.0123456789abcdef #修改默认token
    ttl: 24h0m0s
    usages:

    • signing
    • authentication

kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.10.11 # 此处改为本机IP(修改)
bindPort: 6333 #修改默认端口
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8s-master-01 #修改为master1
taints:

  • effect: NoSchedule
    key: node-role.kubernetes.io/master

apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: "k8s-vip:6333" # VIP:PORT(增加)
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:

dataDir: /data/k8s/etcd

imageRepository: registry.aliyuncs.com/google_containers # 使用国内镜像仓库(增加)
kind: ClusterConfiguration
kubernetesVersion: v1.18.10 # 版本号(修改)
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.233.0.0/16 # pod子网,和Flannel/calico中要一致(增加)

scheduler: {}

apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
初始化 Master1
之前版本:
kubeadm init --config=init.yml --experimental-upload-certs | tee kubeadm-init.log
v1.18.10版本:
kubeadm init --config=init.yml --upload-certs |tee kubeadm-init.log
*如果中途失败, 再次初始化前先执行 kubeadm reset 命令清理, 然后再执行init或join操作
k8s主节点初始化完成后,打开阿里云负载均衡配置,增加SLB内网对kube-apiserver负载配置(这里只能用四层TCP)。
暂且只配置当前master地址,等待其他master节点加入成功后再添加,因为其他两台master还未加入,此时如果配置其他master地址,SLB负载均衡状态将会异常,那其他节点尝试加入集群将会失败。

图片.png

3.5加入master节点

在所有Master节点操作

根据初始化日志提示,执行kubeadm join命令加入其他管理节点。

kubeadm join k8s-vip:6333 --token token0.123456789kubeadm \
--discovery-token-ca-cert-hash sha256:56d53268517... \
--experimental-control-plane --certificate-key c4d1525b6cce4....

修改新加入master节点apiserver端口,以及补全阿里云SLB apiserver负载地址。

修改kube-apiserver监听端口

sed -i 's/6443/6333/g' /etc/kubernetes/manifests/kube-apiserver.yaml

重启kube-apiserver容器

docker restart docker ps | grep k8s_kube-apiserver | awk '{print $1}'

查看kube-apiserver监听端口

ss -anp | grep "apiserver" | grep 'LISTEN'

3.6加入worker节点

在所有Worker节点操作

根据初始化日志提示,执行kubeadm join命令加入其他工作节点。

kubeadm join k8s-vip:6333 --token token0.123456789kubeadm \

      --discovery-token-ca-cert-hash sha256:260796226d…………

注意:token有效期为24小时,失效后请在主节点使用以下命令重新生成
kubeadm token create --print-join-command

3.7部署kubectl
在所有需要的节点操作
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

kubectl 补全 重新打开终端生效

yum -y install bash-completion && cd ~;echo "source <(kubectl completion bash)" >> .bashrc

3.7部署网络插件
在Master1节点操作
calico网络插件
curl -O https://docs.projectcalico.org/v3.9/manifests/calico.yaml
sed -i 's#192.168.0.0/16#10.233.0.0/16#g' calico.yaml
kubectl apply -f calico.yaml

检查集群部署情况
sed -i 's/- --port=0/#- --port=0/g' /etc/kubernetes/manifests/kube-controller-manager.yaml
sed -i 's/- --port=0/#- --port=0/g' /etc/kubernetes/manifests/kube-scheduler.yaml
kubectl get cs && kubectl get nodes && kubectl get pod --all-namespaces

四、安装K8S功能组件
4.1安装dashboard/kuboard
部署dashboard
https://github.com/kubernetes/dashboard
curl -O https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
vim recommended.yaml

...

kind: Service
apiVersion: v1
metadata:
labels:

k8s-app: kubernetes-dashboard

name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:

- port: 443
  targetPort: 8443
  nodePort: 30443

selector:

k8s-app: kubernetes-dashboard

...
kubectl apply -f recommended.yaml
访问:https://ip:30443
kubectl describe secrets -n kubernetes-dashboard kubernetes-dashboard-token-xxxx | grep token | awk 'NR==3{print $2}'
部署kuboard
wget https://kuboard.cn/install-script/kuboard.yaml
kubectl apply -f kuboard.yaml
kubectl apply -f https://addons.kuboard.cn/metrics-server/0.3.6/metrics-server.yaml

获取token
admin:
echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)
只读:
echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kuboard-viewer | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)

访问:http://ip:32567

4.2部署七层路由Ingress
1、 首先下载yaml文件
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.43.0/deploy/static/provider/baremetal/deploy.yaml

2、编辑对应文件修改镜像源(国外镜像地址无法下载修改为阿里源)
image: registry.cn-hangzhou.aliyuncs.com/bin_x/nginx-ingress:v0.43.0@sha256:80359bdf124d49264fabf136d2aecadac729b54f16618162194356d3c78ce2fe

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
246 1
|
2月前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
541 0
|
1月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
228 89
|
6月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
276 9
|
6月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。
|
8月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
837 33
|
8月前
|
Kubernetes 开发者 Docker
集群部署:使用Rancher部署Kubernetes集群。
以上就是使用 Rancher 部署 Kubernetes 集群的流程。使用 Rancher 和 Kubernetes,开发者可以受益于灵活性和可扩展性,允许他们在多种环境中运行多种应用,同时利用自动化工具使工作负载更加高效。
485 19
|
8月前
|
人工智能 分布式计算 调度
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
|
11月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
8月前
|
消息中间件 分布式计算 资源调度
基于云服务器的数仓搭建-集群安装
本文介绍了大数据集群的安装与配置,涵盖Hadoop、Zookeeper、Kafka和Flume等组件。主要内容包括: 1. **数据模拟** 2. **Hadoop安装部署**:详细描述了HDFS和YARN的配置,包括NameNode、ResourceManager的内存分配及集群启动脚本。 3. **Zookeeper安装**:解压、配置`zoo.cfg`文件,并创建myid文件 4. **Kafka安装**:设置Kafka环境变量、配置`server.properties` 5. **Flume安装**:配置Flume采集日志到Kafka,编写启动脚本进行测试。

热门文章

最新文章

推荐镜像

更多