一、环境准备

  使用Hyper-V虚拟机功能搭建三台Centos虚拟机系统,配置好静态IP,分别为k8s-node1(192.168.0.8),k8s-node2(192.168.0.9),k8s-node3(192.168.0.10)。系统安装成功后配置root远程登录功能,以便使用ssh客户端工具链接。

  初始化系统设置:

    ◉分配固定IP :设置虚拟机固定IP的方式比较多,本方案采用设置虚拟的MAC地址为静态ID,然后在路由器中为MAC分配固定IP。

    ◉开启SSH远程登录:运行命令"  yum install openssh-server "安装ssh服务端工具,安装完成后运行命令" systemctl enable sshd.service "设置开启自启动, 运行命令" vim /etc/ssh/sshd_config "编辑配置文件,设置如下:

  ◉修改IPV6为IPV4:centos默认使用ipv6的方式,我们需要修改为ipv4模式来实现ssh客户端的远程连接,具体方法是 cd到 /etc/sysconfig/network-scripts目录下,vim 编辑 ifcfg-eth1 文件,如图,设置IPV6INIT=no,ONBOOT=yes。

  ◉安装docker环境:完成以上步骤后,重启电脑即可使用ssh工具连接,复制命令" curl -sSL https://get.daocloud.io/docker | sh " 安装dockers环境。

  ◉设置docker开机自启:运行命令" systemctl enable docker " 将docker加入开机启动项。

  ◉配置docker镜像加速器:国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,此处以配置阿里云镜像加速器为例,登录https://cr.console.aliyun.com/,选择容器镜像服务-镜像工具-镜像加速器,如图所示,通过在/etc/docker/daemon.json文件中配置registry-mirrors属性来实现该功能:

  ◉设置防火墙规则:设置防火墙规则的目的是为了确保集群中的机器能够相互通信,本次集群直接使用命令" systemctl disable firewalld "关闭防火墙。

  ◉设置 /proc/sys/net/bridge目录下bridge-nf-call-iptables和bridge-nf-call-ip6tables文件的内容为1,确保的 Linux 节点的 iptables 正确查看桥接流量。

  ◉关闭Linux系统的交换分区:为了保证kubelet的正常运行,必须禁用swap交换分区。window平台上称为虚拟内存。在物理内存不够用时,操作系统会从物理内存中把部分暂时不被使用的数据转移到交换分区,从而为当前运行的程序留出足够的物理内存。运行命令" free -m "结果证明已经开启了交换分区,修改/etc/fstab文件,注释掉加载swap分区的这行记录,重启Linux系统即可。

二、安装K8S集群

  完成以上步骤后,就可以进行k8s组件的安装了,我们需要三个必须的组件kubeadm、kubelet 和 kubectl,把他们安装到每台集群的机器上。其中kubeadm是引导我们创建集群的命令;kubelet 是集群中的所有机器上运行的组件,并执行诸如启动 pod 和容器之类的操作;kubectl是与集群对话的命令行工具。读者请注意,kubeadm不会为你安装或管理kubelet和kubectl因此你需要确保它们与control plane之间版本的匹配,如果不这样做,则存在版本偏差的风险,这可能导致意外的错误行为。

  安装步骤:

  1、配置k8s下载地址信息(配置为阿里云镜像,国外镜像很难下载成功),运行如下命令。

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=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

  2、运行如下命令安装三个组件。

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

  3、设置kubelet的开机自启动:启动后kubelet会每隔几秒启动一次来探测kubeadm的命令。

systemctl enable kubelet && systemctl start kubelet

  4、提前准备k8s集群必须的组件:在后续的kubeadm init命令中,他需要下载一些必须镜像,这些镜像可以通过 " kubeadm config images list "命令来查看,如图:

但是这些镜像默认是从国外源,在国内无法下载,因此有必要在此之前先使用国内源下载好这些镜像,此处使用阿里云镜像地址下载:

docker pull  registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.6
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.23.6
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.23.6
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.23.6
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.1-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6

根据上面的命令把镜像都下载完成后,进行镜像复制,调用 "  docker tag  oldimages newimages "命令复制出满足kubeadm init的标准镜像,代码如下:

docker tag  registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.6          k8s.gcr.io/kube-apiserver:v1.23.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.23.6 k8s.gcr.io/kube-proxy:v1.23.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.23.6 k8s.gcr.io/kube-controller-manager:v1.23.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.23.6 k8s.gcr.io/kube-scheduler:v1.23.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.1-0 k8s.gcr.io/etcd:3.5.1-0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 k8s.gcr.io/pause:3.6

执行完成所有复制命令后,docker images查看镜像,发现需要的镜像已准备好,列表如下:

  5、使用kubeadm来引导我们创建集群。首先运行 " kubeadm init  [arg]"命令,会进行一系列预检查以确保机器已准备好运行 Kubernetes。这些预检查会显示警告并在错误时退出(遇到错误时需要根据具体输出日志解决错误)。然后下载并安装集群控制平面组件。 kubeadm init 包含一些指定参数,其参数说明下:

      --apiserver-advertise-address string   设置 apiserver 绑定的 IP.
--apiserver-bind-port int32 设置apiserver 监听的端口. (默认 6443)
--control-plane-endpoint string 设置控制平面的端点(matser控制节点的IP或域名)
--apiserver-cert-extra-sans strings api证书中指定额外的Subject Alternative Names (SANs) 可以是IP 也可以是DNS名称。 证书是和SAN绑定的。
--cert-dir string 证书存放的目录 (默认 "/etc/kubernetes/pki")
--certificate-key string kubeadm-cert secret 中 用于加密 control-plane 证书的key
--config string kubeadm 配置文件的路径.
--cri-socket string CRI socket 文件路径,如果为空 kubeadm 将自动发现相关的socket文件; 只有当机器中存在多个 CRI socket 或者 存在非标准 CRI socket 时才指定.
--dry-run 测试,并不真正执行;输出运行后的结果.
--feature-gates string 指定启用哪些额外的feature 使用 key=value 对的形式。
--help -h 帮助文档
--ignore-preflight-errors strings 忽略前置检查错误,被忽略的错误将被显示为警告. 例子: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks.
--image-repository string 选择拉取 control plane images 的镜像repo (default "k8s.gcr.io") ,国内一般无法直接从k8s.gcr.io获取,需要改为国内的代理地址
--kubernetes-version string 选择K8S版本. (default "stable-1")
--node-name string 指定node的名称,默认使用 node 的 hostname.
--pod-network-cidr string 指定 pod 的网络, control plane 会自动将 网络发布到其他节点的node,让其上启动的容器使用此网络
--service-cidr string 指定service 的IP 范围. (default "10.96.0.0/12"),不能与机器的IP段有重叠
--service-dns-domain string 指定 service 的 dns 后缀, e.g. "myorg.internal". (default "cluster.local")
--skip-certificate-key-print 不打印 control-plane 用于加密证书的key.
--skip-phases strings 跳过指定的阶段(phase)
--skip-token-print 不打印 kubeadm init 生成的 default bootstrap token
--token string 指定 node 和control plane 之间,简历双向认证的token ,格式为 [a-z0-9]{6}\.[a-z0-9]{16} - e.g. abcdef.0123456789abcdef
--token-ttl duration token 自动删除的时间间隔。 (e.g. 1s, 2m, 3h). 如果设置为 '0', token 永不过期 (default 24h0m0s)
--upload-certs 上传 control-plane 证书到 kubeadm-certs Secret.

  本方案我们使用如下命令参数来初始化主控节点:

kubeadm init \
--apiserver-advertise-address=192.168.0.10 \
--control-plane-endpoint=192.168.0.10 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16

  执行以上命令,init 预检查到我的机器CUP和内存不满足性能要求,提示如下:此时需要关闭虚拟机,重新调整CPU核心数和内存大小。

继续运行命令,发现提示 "  It seems like the kubelet isn't running or healthy. ",的错误,表示kubelet未能正常运行,通过查看kubelet的运行日志发现报错如下:

意思是因为kubelet cgroup驱动程序“systemd”与docker cgroup驱动程序“cgroupfs”不同,所以我们需要调整为相同。调整方式为修改docker cgroup的驱动程序为systemd(官方推荐用systemd),编辑/etc/docker/daemon.json文件,修改或增加  "exec-opts":["native.cgroupdriver=systemd"] 代码:

{
"registry-mirrors": ["https://yyipnm7g.mirror.aliyuncs.com"],
"exec-opts":["native.cgroupdriver=systemd"]
}

重启机器再次运行init命令(如果运行失败,提示某些端口被占用和某些文件已经存在,需要使用"  kubeadm reset  "重置后再运行)后,这可能会需要几分钟来完成组件的安装,安装成功后应该看到类似如下的输出:

 

屏幕输出中提示:

  ◉你的Kubernetes控制飞机已成功初始化。

  ◉要开始使用群集,您需要以普通用户身份运行以下操作:

  mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

或者如果你是root用户,可以运行:

  export KUBECONFIG=/etc/kubernetes/admin.conf

  ◉您应该在集群上部署一个pod网络,使用下列选项之一运行kubectl apply -f [podnetwork].yaml:

 https://kubernetes.io/docs/concepts/cluster-administration/addons/

选项提供了一个地址,这个地址包含了很多的网络插件,如图:

此处本人使用Calico插件,点击选项可能无法访问网址,无法下载其对应的yaml文件。使用如下命令下载yaml文件:

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

如果无法直接在Linux中下载,可以直接访问https://docs.projectcalico.org/manifests/calico.yaml下载后上传到主机。然后再使用命令:

kubectl apply -f calico.yaml

创建POD网络,如图所示,表示POD网络创建完成:

等待一段时间使用 "  kubectl get nodes  "查看节点状态,节点将由NotReady-->Ready,如图:

  ◉通过在每个节点上复制证书颁发机构和服务帐户密钥,然后以root用户身份运行以下操作,可以加入任意数量的控制平面节点:

 kubeadm join 192.168.0.10:6443 --token zh274u.866t6kyo6cpxv40f \
--discovery-token-ca-cert-hash sha256:c87e21c58a669984cd9ae2bd46ba34976584d88948b2445a378b9b6b734641c8 \
--control-plane

  ◉通过root用户身份在每个节点上运行以下操作,可以加入任意数量的工作节点:

kubeadm join 192.168.0.10:6443 --token zh274u.866t6kyo6cpxv40f \
--discovery-token-ca-cert-hash sha256:c87e21c58a669984cd9ae2bd46ba34976584d88948b2445a378b9b6b734641c8

根据这些提示完成提示操作后,集群环境就搭建完成了,init成功后的这些提示建议保存,方便后续增加主节点和工作节点。最终查看集群状态结果如下:

三、在集群中部署应用

待续。。

从零开始搭建高可用的k8s集群的更多相关文章

  1. K8S 使用Kubeadm搭建高可用Kubernetes(K8S)集群 - 证书有效期100年

    1.概述 Kubenetes集群的控制平面节点(即Master节点)由数据库服务(Etcd)+其他组件服务(Apiserver.Controller-manager.Scheduler...)组成. ...

  2. keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群

    keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群 内网路由都用mac地址 一个mac地址绑定多个ip一个网卡只能一个mac地址,而且mac地址无法改,但 ...

  3. kubernetes教程第一章-kubeadm高可用安装k8s集群

    目录 Kubeadm高可用安装k8s集群 kubeadm高可用安装1.18基本说明 k8s高可用架构解析 kubeadm基本环境配置 kubeadm基本组件安装 kubeadm集群初始化 高可用Mas ...

  4. 高可用的K8S集群部署方案

    涉及到的内容 LVS HAProxy Harbor etcd Kubernetes (Master Worker) 整体拓补图 以上是最小生产可用的整体拓补图(相关节点根据需要进行增加,但不能减少) ...

  5. Kubernetes全栈架构师(Kubeadm高可用安装k8s集群)--学习笔记

    目录 k8s高可用架构解析 Kubeadm基本环境配置 Kubeadm系统及内核升级 Kubeadm基本组件安装 Kubeadm高可用组件安装 Kubeadm集群初始化 高可用Master及Token ...

  6. Kubernetes实战指南(三十四): 高可用安装K8s集群1.20.x

    @ 目录 1. 安装说明 2. 节点规划 3. 基本配置 4. 内核配置 5. 基本组件安装 6. 高可用组件安装 7. 集群初始化 8. 高可用Master 9. 添加Node节点 10. Cali ...

  7. Kubernetes全栈架构师(二进制高可用安装k8s集群部署篇)--学习笔记

    目录 二进制高可用基本配置 二进制系统和内核升级 二进制基本组件安装 二进制生成证书详解 二进制高可用及etcd配置 二进制K8s组件配置 二进制使用Bootstrapping自动颁发证书 二进制No ...

  8. Kubernetes全栈架构师(二进制高可用安装k8s集群扩展篇)--学习笔记

    目录 二进制Metrics&Dashboard安装 二进制高可用集群可用性验证 生产环境k8s集群关键性配置 Bootstrapping: Kubelet启动过程 Bootstrapping: ...

  9. 手动搭建高可用的kubernetes 集群

    之前按照和我一步步部署 kubernetes 集群的步骤一步一步的成功的使用二进制的方式安装了kubernetes集群,在该文档的基础上重新部署了最新的v1.8.2版本,实现了kube-apiserv ...

随机推荐

  1. SynchronizedMap 和 ConcurrentHashMap 有什么区别?

    SynchronizedMap 一次锁住整张表来保证线程安全,所以每次只能有一个线程来 访为 map. ConcurrentHashMap 使用分段锁来保证在多线程下的性能. ConcurrentHa ...

  2. spring boot 实现优雅的关闭

    1.导入jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  3. http和https到底区别在哪

    一.Http和Https的基本概念 Http:超文本传输协议(Http,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.设计Http最初的目的是为了提供一 ...

  4. 学习ITIL

    ITIL IT运维管理体系: IT管理中的PPT(people人:process流程:technology技术): 标准化(是否有紧急故障处理流程).工具化: 备份解决方案:灾备解决方案: 监控解决方 ...

  5. kali Linux 渗透测试 | ARP 欺骗

    目录 ARP 欺骗及其原理 ARP 欺骗实施步骤 必备工具安装 nmap 工具 dsniff 工具 driftnet 工具 ettercap 工具 ARP 欺骗测试 ARP 断网攻击 ARP 欺骗(不 ...

  6. Microservices

    Microservices What are Microservices? What are Microservices - microservices.io Microservices - mart ...

  7. JavaScript 的Date构造函数太迷惑了。。。

    1 new Date(2021,0,1,0,0,0,0) ===> Fri Jan 01 2021 00:00:00 GMT+0800 (中国标准时间) 2 new Date(2021,1,1, ...

  8. pip导出项目依赖包名称及版本,再安装命令

    A导出依赖 pip freeze >requirements.txt B导入安装依赖 pip install -r requirements.txt 使用下面的命令安装依赖能自动跳过安装错误的依 ...

  9. Arrays工具类与Collections工具类

    Arrays工具类 : Arrays.sort():对指定数组进行排序,从小到大 Arrays.toString():返回数组的内容的字符串表示形式 Arrays.asList():数组转List,但 ...

  10. springboot+maven实现模块化编程

    1.创建新项目repo-modele 2.右键Repo_modele -> New -> Module-->next 分别创建bs-web,bs-service,bs-entity, ...