前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从零开始搭建K8s集群

从零开始搭建K8s集群

作者头像
胡齐
发布2020-05-26 16:18:04
4.3K0
发布2020-05-26 16:18:04
举报
文章被收录于专栏:运维猫运维猫

1、简介

Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。

名称 Kubernetes 源于希腊语,意为 “舵手” 或 “飞行员”。Google 在 2014 年开源了 Kubernetes 项目。Kubernetes 建立在 Google 在大规模运行生产工作负载方面拥有十几年的经验的基础上,结合了社区中最好的想法和实践。

2、k8s优势

容器是打包和运行应用程序的好方式。在生产环境中,您需要管理运行应用程序的容器,并确保不会停机。例如,如果一个容器发生故障,则需要启动另一个容器。如果系统处理此行为,会不会更容易?

这就是 Kubernetes 的救援方法!Kubernetes 为您提供了一个可弹性运行分布式系统的框架。Kubernetes 会满足您的扩展要求、故障转移、部署模式等。例如,Kubernetes 可以轻松管理系统的 Canary 部署。

Kubernetes 为您提供:

  • 服务发现和负载均衡Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果到容器的流量很大,Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
  • 存储编排Kubernetes 允许您自动挂载您选择的存储系统,例如本地存储、公共云提供商等。
  • 自动部署和回滚您可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为所需状态。例如,您可以自动化 Kubernetes 来为您的部署创建新容器,删除现有容器并将它们的所有资源用于新容器。
  • 自动二进制打包Kubernetes 允许您指定每个容器所需 CPU 和内存(RAM)。当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。
  • 自我修复Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
  • 密钥与配置管理Kubernetes 允许您存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。您可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

3、架构

1、创建tomcat集群 请求过来-》master节点的apiserver。

2、apiserver解析请求,把需要干的活解析出来,放在etcd存储集群中。

3、apiserver通知 controller manager ,要干活了,controller manager 再从apiserver获取现在还没做的部署

4、controller manager拿到需要做的部署,产生一次部署信息。把这个东西又存到etcd里面。

5、通知 schduler(调度器),该进行调度了,schduler再从apiserver里面拿到刚才controller manager生产的部署信息,进行调度(找一个闲的节点,进行调度)。

6、scheduler 把这个调度规则保存到etcd里面。

7、其他node节点的kubelet 会监听apiserver。发现有自己要干的活了。kubelet就要来活。进行部署。

4、搭建k8s集群

1.所有节点前置环境配置
  • centos 版本为 7.6 或 7.7、CPU 内核数量大于等于 2,且内存大于等于 4G。
  • hostname 不是 localhost,且不包含下划线、小数点、大写字母。
  • 任意节点都有固定的内网 IP 地址(集群机器统一内网)。
  • 任意节点上 IP 地址 可互通(无需 NAT 映射即可相互访问),且没有防火墙、安全组隔离。
  • 任意节点不会直接使用 docker run 或 docker-compose 运行容器。
代码语言:javascript
复制
 # 关闭防火墙
 [root@k8s01 ~]# systemctl stop firewalld
 [root@k8s03 ~]# systemctl disable firewalld
 
 # 关闭selinux
 [root@k8s01 ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config 
 [root@k8s01 ~]# setenforce 0
 
 # 关闭swap分区
 [root@k8s01 ~]# swapoff -a
 [root@k8s01 ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab 
 
 # 绑定hosts
 [root@k8s01 ~]# cat /etc/hosts
 ::1localhostlocalhost.localdomainlocalhost6localhost6.localdomain6
 127.0.0.1localhostlocalhost.localdomainlocalhost4localhost4.localdomain4
 
 172.26.55.13k8s01
 172.26.55.14   k8s02
 172.26.55.15   k8s03
2.检查网络是否通
代码语言:javascript
复制
 [root@k8s01 ~]# ping -c 2 k8s01
 PING k8s01 (172.26.55.13) 56(84) bytes of data.
 64bytes from k8s01 (172.26.55.13): icmp_seq=1ttl=64time=0.012 ms
 64bytes from k8s01 (172.26.55.13): icmp_seq=2ttl=64time=0.021 ms
 
 ---k8s01 pingstatistics ---
 2packets transmitted, 2received, 0% packet loss, time 999ms
 rtt min/avg/max/mdev =0.012/0.016/0.021/0.006 ms
 [root@k8s01 ~]# ping -c 2 k8s02
 PING k8s02 (172.26.55.14) 56(84) bytes of data.
 64bytes from k8s02 (172.26.55.14): icmp_seq=1ttl=64time=0.352 ms
 64bytes from k8s02 (172.26.55.14): icmp_seq=2ttl=64time=0.217 ms
 
 ---k8s02 pingstatistics ---
 2packets transmitted, 2received, 0% packet loss, time 999ms
 rtt min/avg/max/mdev =0.217/0.284/0.352/0.069 ms
 [root@k8s01 ~]# ping -c 2 k8s03
 PING k8s03 (172.26.55.15) 56(84) bytes of data.
 64bytes from k8s03 (172.26.55.15): icmp_seq=1ttl=64time=0.418 ms
 64bytes from k8s03 (172.26.55.15): icmp_seq=2ttl=64time=0.232 ms
 
 ---k8s03 pingstatistics ---
 2packets transmitted, 2received, 0% packet loss, time 1000ms
 rtt min/avg/max/mdev =0.232/0.325/0.418/0.093 ms
3.将桥接的 IPv4 流量传递到 iptables 的链
代码语言:javascript
复制
 # 修改 /etc/sysctl.conf
 # 如果有配置,则修改
 sed-i"s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g"/etc/sysctl.conf
 sed-i"s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g"/etc/sysctl.conf
 sed-i"s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g"/etc/sysctl.conf
 sed-i"s#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6=1#g"/etc/sysctl.conf
 sed-i"s#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6=1#g"/etc/sysctl.conf
 sed-i"s#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6=1#g"/etc/sysctl.conf
 sed-i"s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding=1#g"/etc/sysctl.conf
 # 可能没有,追加
 echo"net.ipv4.ip_forward = 1">> /etc/sysctl.conf
 echo"net.bridge.bridge-nf-call-ip6tables = 1">> /etc/sysctl.conf
 echo"net.bridge.bridge-nf-call-iptables = 1">> /etc/sysctl.conf
 echo"net.ipv6.conf.all.disable_ipv6 = 1">> /etc/sysctl.conf
 echo"net.ipv6.conf.default.disable_ipv6 = 1">> /etc/sysctl.conf
 echo"net.ipv6.conf.lo.disable_ipv6 = 1">> /etc/sysctl.conf
 echo"net.ipv6.conf.all.forwarding = 1">> /etc/sysctl.conf
 # 执行命令以应用
 [root@k8s-001 ~]# sysctl -p
4.安装docker
代码语言:javascript
复制
 # 卸载旧版本
 sudoyum remove docker \
 docker-client \
 docker-client-latest \
 docker-common \
 docker-latest \
 docker-latest-logrotate \
 docker-logrotate \
 docker-engine
 
 # 安装基础以来
 yum install -yyum-utils \
 device-mapper-persistent-data \
 lvm2
 
 # 配置docker yum源
 sudoyum-config-manager \
 --add-repo\
 http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 
 # 安装并启动 docker
 yum install -ydocker-ce-19.03.8 docker-ce-cli-19.03.8 containerd.io
 systemctl enable docker
 systemctl startdocker
 
 # 配置docker加速
 sudomkdir-p/etc/docker
 sudotee/etc/docker/daemon.json <<-'EOF'
 {
  "registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"]
 }
 EOF
5.安装 nfs-utils
代码语言:javascript
复制
 # 必须先安装 nfs-utils 才能挂载 nfs 网络存储
 [root@k8s01 ~]# yum install -y nfs-utils
6.安装k8s、kubelet、kubeadm、kubectl
代码语言:javascript
复制
 [root@k8s03 ~]# yum remove -y kubelet kubeadm kubectl
 已加载插件:fastestmirror
 参数 kubelet 没有匹配
 参数 kubeadm 没有匹配
 参数 kubectl 没有匹配
 不删除任何软件包
 
 # 配置K8S的yum源
 cat<<EOF > /etc/yum.repos.d/kubernetes.repo
 [kubernetes]
 name=Kubernetes
 baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
 enabled=1
 gpgcheck=0
 repo_gpgcheck=0
 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
 EOF
 
 [root@k8s01 ~]# yum install -y kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3
 
 [root@k8s01 ~]# systemctl enable kubelet && systemctl start kubelet
 Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
 
 [root@k8s01 ~]# systemctl enable kubelet && systemctl start kubelet
7.下载镜像
代码语言:javascript
复制
 [root@k8s01 ~]# vim mast.sh
 #!/bin/bash
 images=(
 kube-apiserver:v1.17.3
 kube-proxy:v1.17.3
 kube-controller-manager:v1.17.3
 kube-scheduler:v1.17.3
 coredns:1.6.5
 etcd:3.4.3-0
 pause:3.1
 )
 forimageName in${images[@]}; do
   docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
 done
 [root@k8s01 ~]# chmod 777 mast.sh 
 [root@k8s01 ~]# sh mast.sh 

---------------------以上所有操作主节点与worker节点都要执行----------------------

5、创建master集群

1.初始化master节点
代码语言:javascript
复制
 kubeadm init \
 --apiserver-advertise-address=172.26.248.150 \
 --image-repositoryregistry.cn-hangzhou.aliyuncs.com/google_containers \
 --kubernetes-versionv1.17.3 \
 --service-cidr=10.96.0.0/16 \
 --pod-network-cidr=10.244.0.0/16
2.配置 kubectl
代码语言:javascript
复制
 mkdir-p$HOME/.kube
 sudocp-i/etc/kubernetes/admin.conf $HOME/.kube/config
 sudochown$(id -u):$(id -g)$HOME/.kube/config
3.提前保存令牌
代码语言:javascript
复制
 kubeadm join 172.26.184.101:6443 --token98mq7n.blsjom2b416sodow \
 --discovery-token-ca-cert-hashsha256:a1cd9ab6c0f26cd1e792bc953228a0492948f9b85620bc448dbe1ce2d871cda8
4.部署网络插件
代码语言:javascript
复制
 kubectl apply -fhttps://docs.projectcalico.org/manifests/calico.yaml

6、worker节点加入集群

代码语言:javascript
复制
 #1、使用刚才master打印的令牌命令加入
 kubeadm join 172.26.248.150:6443 --tokenktnvuj.tgldo613ejg5a3x4 \
    --discovery-token-ca-cert-hashsha256:f66c496cf7eb8aa06e1a7cdb9b6be5b013c613cdcf5d1bbd88a6ea19a2b454ec
 #2、如果超过2小时忘记了令牌,可以这样做
 kubeadm token create --print-join-command#打印新令牌
 kubeadm token create --ttl0--print-join-command#创建个永不过期的令牌

7、查看是否加入成功

代码语言:javascript
复制
 [root@k8s-001 ~]# kubectl get node
 NAME     STATUS   ROLES   AGE     VERSION
 k8s-001   Ready   master   6h58m   v1.17.3
 k8s-002   Ready   <none>   6h50m   v1.17.3

如果文章有任何错误欢迎不吝赐教,其次大家有任何关于运维的疑难杂问,也欢迎和大家一起交流讨论

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维猫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、简介
  • 2、k8s优势
  • 3、架构
  • 4、搭建k8s集群
    • 1.所有节点前置环境配置
      • 2.检查网络是否通
        • 3.将桥接的 IPv4 流量传递到 iptables 的链
          • 4.安装docker
            • 5.安装 nfs-utils
              • 6.安装k8s、kubelet、kubeadm、kubectl
                • 7.下载镜像
                • 5、创建master集群
                  • 1.初始化master节点
                    • 2.配置 kubectl
                      • 3.提前保存令牌
                        • 4.部署网络插件
                        • 6、worker节点加入集群
                        • 7、查看是否加入成功
                        相关产品与服务
                        容器服务
                        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档