公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !


前言

部署 Kubernetes 除了手动方式外,还有诸如 Kubeadm、Kubespray、Breeze、Rancher、kargo 等多种自动化方式。工具没有好坏之分,能干事、效率高就行。

这里,笔者仍使用 Kubespray 部署当前 K8s 最新版本(用着真的很贴身),可自动化部署 HA 集群、可灵活定制开发、高稳定性等。

本文将介绍如何在不用科学上网的背景下,快速自动化部署 K8s 集群。那么,开始吧!

初始化环境

环境说明

环境实在有限,只有一台机器,想玩 HA 集群也没环境啊。

主机名 IP 地址 角色
K8s 172.16.0.180 Master+node

环境为 Centos 7 系统,各节点配置 hosts 和 hostname,如:

$ cat /etc/hosts
$ 172.16.0.180   K8s

关闭防火墙等

$ sed -i 's/SELINUX=*/SELINUX=disabled/' /etc/selinux/config
$ systemctl disable firewalld && systemctl stop firewalld

Kubernetes 1.8 开始要求关闭系统的 Swap 交换分区,方法如下:

$ swapoff -a && echo "vm.swappiness=0" >> /etc/sysctl.conf && sysctl -p && free –h

Docker 从 1.13 版本开始调整了默认的防火墙规则,禁用了 iptables filter 表中 FOWARD 链,这样会引起 Kubernetes 集群中跨 Node 的 Pod 无法通信,在各个 Docker 节点执行下面的命令:

$ iptables -P FORWARD ACCEPT

配置 SSH Key 认证。确保本机也可以 SSH 连接,否则下面部署失败。

$ ssh-keygen -t rsa -N ""
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

更新系统内核为 4.4.x , CentOS 默认为 3.10.x 。

$ rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
$ rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
$ yum --enablerepo=elrepo-kernel install -y kernel-lt kernel-lt-devel
$ grub2-set-default 0

重启系统

$ reboot

增加内核配置

$ vim /etc/sysctl.conf
# docker
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

使其内核配置生效

$ sysctl -p

安装 Kubespray

安装 Centos 的 EPEL 源

$ yum -y install epel-release

更新缓存

$ yum clean all && yum makecache

安装相关软件(Ansible 版本必须 >= 2.7)

$ yum install -y python-pip python34 python-netaddr python34-pip ansible git

下载源码,当前 Kubespray 项目的 Master 分支默认安装 K8s 1.13.1 版本。

$ git clone https://github.com/kubernetes-sigs/kubespray

安装 Kubespray 依赖,若无特殊说明,后续操作均在 ~/kubespray 目录下执行。

$ cd kubespray
$ pip install -r requirements.txt

配置 Kubespray

$ cp -rfp inventory/sample inventory/mycluster

修改配置文件 hosts.ini。

$ vim inventory/mycluster/hosts.ini
[all]
k8s ansible_host=k8s ip=172.16.0.180[kube-master]
k8s[etcd]
k8s[kube-node]
k8s[k8s-cluster:children]
kube-master
kube-node[calico-rr]

修改配置文件 all.yaml

$ vim inventory/mycluster/group_vars/all/all.yml
# 修改如下配置:
loadbalancer_apiserver_localhost: true
# 加载内核模块,否则 ceph, gfs 等无法挂载客户端
kubelet_load_modules: true

默认镜像从 gcr.io/google-containers 下载,由于墙的原因不能下载。这里我将 K8s 1.13.1 版本所必须的镜像 Push 到了 DockerHub上,方便大家下载使用。

# 下载镜像(该步骤可不用执行)
$ docker pull xiaoxu780/kube-proxy:v1.13.1
$ docker pull xiaoxu780/kube-controller-manager:v1.13.1
$ docker pull xiaoxu780/kube-scheduler:v1.13.1
$ docker pull xiaoxu780/kube-apiserver:v1.13.1
$ docker pull xiaoxu780/coredns:1.2.6
$ docker pull xiaoxu780/cluster-proportional-autoscaler-amd64:1.3.0
$ docker pull xiaoxu780/kubernetes-dashboard-amd64:v1.10.0
$ docker pull xiaoxu780/etcd:3.2.24
$ docker pull xiaoxu780/node:v3.1.3
$ docker pull xiaoxu780/ctl:v3.1.3
$ docker pull xiaoxu780/kube-controllers:v3.1.3
$ docker pull xiaoxu780/cni:v3.1.3
$ docker pull xiaoxu780/pause-amd64:3.1

修改镜像默认的 Repo 地址,使用 Calico 三层网络,同时可以指定安装的 K8s版本,参数为 kube_version。编辑文件:

$ vim inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml
kube_image_repo: "gcr.io/google-containers" //修改为kube_image_repo: "xiaoxu780"

修改配置文件 main.yml,使用 Sed 命令批量替换。

$ sed -i 's/gcr\.io\/google_containers/xiaoxu780/g' roles/download/defaults/main.yml
$ sed -i 's/quay\.io\/coreos/xiaoxu780/g' roles/download/defaults/main.yml
$ sed -i 's/quay\.io\/calico/xiaoxu780/g' roles/download/defaults/main.yml

修改代码,使用 NodePort 方式访问 Dashboard。

$ vim ./roles/kubernetes-apps/ansible/templates/dashboard.yml.j2
# ------------------- Dashboard Service ------------------- #
……
……targetPort: 8443type: NodePort    //添加这一行    selector:
k8s-app: kubernetes-dashboard

注意:如果是单节点部署 K8s,Kubespray 默认会创建 2 个 coredns Pod,但 Deployment 中又用到了 podAntiAffinity,因此会导致其中一个 coredns pod pending,所以需要修改代码如下:

$ vim ./roles/kubernetes-apps/ansible/templates/coredns-deployment.yml.j2
//注释掉以下几行代码affinity:#podAntiAffinity:#  requiredDuringSchedulingIgnoredDuringExecution:#  - topologyKey: "kubernetes.io/hostname"#    labelSelector:#      matchLabels:#        k8s-app: coredns{{ coredns_ordinal_suffix | default('') }}或者在spec一行添加代码:
spec:replicas: 1   //指定pod为1个副本

安装 K8s 集群

1.  K8s 高可用方案

Kubernetes 的高可用,要解决的核心其实是 kube-apiserver 组件和 etcd 的高可用,其它组件在多节点模式下,本身拥有天然容灾性。

2.  etcd 高可用

etcd 本身就支持集群模式,所以啥都不用考虑,只要保证节点数量足够,升级备份之类的事情,kubespray 本身就支持多节点 etcd 部署。由于 etcd 采用 Raft 一致性算法,集群规模最好不要超过 9 个,推荐 3,5,7,9 个数量。具体看集群规模。如果性能不够,宁可多分配资源,也最好不要超过 9 个。

3. api 高可用

api 的高可用,一般有 2 种思路。

  • 各节点自己代理

使用这种方式,会在每个 Node 节点启动一个 Nginx 代理,然后由这个 Nginx 代理负载所有的 master 节点的 api。master 会访问自己节点下的 api(localhost)。这是 Kubespray 部署的默认方式。

  • 外置负载均衡

利用外部的负载均衡实现,例如阿里云的 SLB 或自建的 HAproxy 等。

将 hyperkube 和 kubeadm 包下载到所有 K8s 节点的 /tmp/releases 目录下,为了避免科学上网,此处我下载存放到了网盘上。如果你也需要可以直接在 https://pan.baidu.com/s/1m2rF1dRXIZh_15OevTDbnA 上下载。

4. 执行部署命令

$ ansible-playbook -i inventory/mycluster/hosts.ini cluster.yml -b -v -k

5. 运维经验

如果需要扩容 Work 节点,则修改 hosts.ini 文件,增加新增的机器信息。然后执行下面的命令:

$ ansible-playbook -i inventory/mycluster/hosts.ini scale.yml -b -v -k

将 hosts.ini 文件中的 master 和 etcd 的机器增加到多台,执行部署命令

$ ansible-playbook -i inventory/mycluster/hosts.ini cluster.yml -b -vvv

刪除节点,如果不指定节点就是刪除整个集群:

$ ansible-playbook -i inventory/mycluster/hosts.ini remove-node.yml -b -v

如果需要卸载,可以执行以下命令:

$ ansible-playbook -i inventory/mycluster/hosts.ini reset.yml -b –vvv

升级 K8s 集群,选择对应的 K8s 版本信息,执行升级命令。涉及文件为 upgrade-cluster.yml。

$ ansible-playbook upgrade-cluster.yml -b -i inventory/mycluster/hosts.ini -e kube_version=vX.XX.XX -vvv

登录 Dashboard

登陆 Dashboard 支持 kubeconfig 和 token 两种认证方式,kubeconfig 也依赖 token 字段,所以生成 token 这一步是必不可少的。此处,我们获取集群管理员(拥有所有命名空间的 admin 权限)的 token。

查看 kubernetes-dashboard 暴露的端口,如下所示,这里是31777端口。

$ kubectl get svc --all-namespaces | grep kubernetes-dashboard
kube-system   kubernetes-dashboard   NodePort    10.233.34.183   <none>        443:31777/TCP            12h

获取 admin 的 token

$ kubectl -n kube-system describe $(kubectl -n kube-system get secret -n kube-system -o name | grep namespace) | grep token
Name:         namespace-controller-token-kmtg7
Type:  kubernetes.io/service-account-token
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJuYW1lc3BhY2UtY29udHJvbGxlci10b2tlbi1rbXRnNyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJuYW1lc3BhY2UtY29udHJvbGxlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImQwYTI0N2JkLTEwY2EtMTFlOS1iYTFiLWEwMzY5ZjNmMDQwNCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTpuYW1lc3BhY2UtY29udHJvbGxlciJ9.v689nSk_SxDLWk5Mna0t9uITRE1Jy2mstZxeJfZmQmm2UsQ-vIm4ueUNtCoA-PNx49s9hic-Pn6PfqyWQQW_QQ1yLDjjp1wl4J3tdar8fBfuR7Zvm5aKw8kyRhfQzQQZgEKlgBEHaYyKicgVUwEupa3zevXdUTnLH8FudcOdWEwgCflCveHdkRwoy88pYPyL5wh2egEKpeDhzOEztULsi2g3tpdlyg_uQIaKJ1OBODJZz5PXVFMYyIk06SyciEOX0YxF3pH_uSlPqg4RxMaeTfPhlWTnFPlIjQ2juK4s0o2Tyg_sftLSXvd3QtOg3tBavRm3pzHISIPbtN7EZAyWZQ

在 dashboard 登录页面上使用上面输出中的那个非常长的字符串作为 token 登录,即可以拥有管理员权限操作整个 kubernetes 集群中的对象。当然您也可以将这串 token 加到 admin 用户的 kubeconfig 文件中,继续使用 kubeconfig 登录,两种认证方式任您选择。

登录 dashboard:https://172.16.0.180:31777

注意:由于这里使用的 HTTPS,并未使用证书,因此使用 Google 等浏览器会终止访问。


验证 K8s 集群

  • 查看集群状态

$ kubectl get nodes
NAME   STATUS   ROLES         AGE   VERSION
k8s    Ready    master,node   36m   v1.13.1
  • 查看集群 Pod 状态

$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-687b7cc79c-knj87   1/1     Running   0          35m
kube-system   calico-node-7rj8c                          1/1     Running   0          35m
kube-system   coredns-5b47d4476c-8wdb7                   1/1     Running   0          35m
kube-system   coredns-5b47d4476c-92wnq                   1/1     Running   0          35m
kube-system   dns-autoscaler-5b547856bc-95cft            1/1     Running   0          35m
kube-system   kube-apiserver-k8s                         1/1     Running   0          36m
kube-system   kube-controller-manager-k8s                1/1     Running   0          36m
kube-system   kube-proxy-cdlzp                           1/1     Running   0          35m
kube-system   kube-scheduler-k8s                         1/1     Running   0          36m
kube-system   kubernetes-dashboard-d7978b5cc-lvf6l       1/1     Running   0          35m
  • 查看 IPVS

$ ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.0.180:32714 rr-> 10.233.65.133:8443           Masq    1      0          0
TCP  172.17.0.1:32714 rr-> 10.233.65.133:8443           Masq    1      0          0
TCP  10.233.0.1:443 rr-> 172.16.0.180:6443            Masq    1      5          0
TCP  10.233.0.3:53 rr-> 10.233.65.131:53             Masq    1      0          0         -> 10.233.65.134:53             Masq    1      0          0
TCP  10.233.0.3:9153 rr-> 10.233.65.131:9153           Masq    1      0          0         -> 10.233.65.134:9153           Masq    1      0          0
TCP  10.233.45.198:443 rr-> 10.233.65.133:8443           Masq    1      0          0
TCP  10.233.65.128:32714 rr-> 10.233.65.133:8443           Masq    1      0          0
TCP  127.0.0.1:32714 rr-> 10.233.65.133:8443           Masq    1      0          0
UDP  10.233.0.3:53 rr-> 10.233.65.131:53             Masq    1      0          0         -> 10.233.65.134:53             Masq    1      0          0
  • 创建一个 Nginx 应用的 Deplpyment

K8s中,针对无状态类服务推荐使用Deployment,有状态类服务则建议使用 Statefulset。RC 和 RS 已不支持目前K8s 的诸多新特性了。

$ vim nginx-deployment.yamlapiVersion: apps/v1
kind: Deployment
metadata: name: nginx-dm
spec: replicas: 3selector:matchLabels:name: nginxtemplate: metadata: labels: name: nginx spec: containers: - name: nginx image: nginx:alpine imagePullPolicy: IfNotPresentports:- containerPort: 80name: http
---apiVersion: v1
kind: Service
metadata: name: nginx-svc
spec: ports: - port: 80name: httptargetPort: 80protocol: TCP selector: name: nginx
$ kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-dm created
service/nginx-svc created$ kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
nginx-dm-799879696c-9cdgz   1/1     Running   0          30s
nginx-dm-799879696c-cwzn5   1/1     Running   0          30s
nginx-dm-799879696c-xwjd7   1/1     Running   0          30s$ kubectl get svc -o wide
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE   SELECTOR
kubernetes   ClusterIP   10.233.0.1      <none>        443/TCP   39m   <none>
nginx-svc    ClusterIP   10.233.42.172   <none>        80/TCP    65s   name=nginx$ ipvsadm -L -n
  • 测试 Nginx 服务是否正常

$ curl -I 10.233.42.172
HTTP/1.1 200 OK
Server: nginx/1.15.8
Date: Sat, 05 Jan 2019 09:58:16 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Wed, 26 Dec 2018 23:21:49 GMT
Connection: keep-alive
ETag: "5c240d0d-264"
Accept-Ranges: bytes

后续

K8s 从 1.11 版本起便废弃了 Heapster 监控组件,取而代之的是 metrics-server 和 custom metrics API,后面将陆续完善包括 Prometheus+Grafana监控,Kibana+Fluentd 日志管理,cephfs-provisioner 存储(可能需要重新build kube-controller-manager 装上 rbd 相关的包才能使用 Ceph RBD StorageClass),traefik ingress 等服务。

参考资料

  • https://github.com/kubernetes-sigs/kubespray/blob/master/docs/getting-started.md

来源:xuchao's blog
原文:http://t.cn/ESymdzW
题图:来自谷歌图片搜索 
版权:本文版权归原作者所有
投稿:欢迎投稿,投稿邮箱: editor@hi-linux.com

你可能还喜欢

点击下方图片即可阅读

假如服务器上没有 Docker 环境,你还能愉快的拉取容器镜像吗?

点击上方图片,打开小程序,加入「玩转 Linux」圈子

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

还在手动部署 Kubernetes 集群吗,是时候使用 Kubespray 完成自动化部署了!相关推荐

  1. 部署Kubernetes集群(二进制 v1.18.8版)

    第一章 kubernetes 功能介绍 · kubernetes 从入门到实践 · 看云 二进制 部署Kubernetes集群 组件版本 组件 版本 二进制包下载地址 备注 centos 7.8.20 ...

  2. 部署Kubernetes集群(二进制 v1.18.5版)

    文章目录 一.Kubernetes的基本知识 1. 安装要求 2. 系统初始化配置 二.部署Etcd集群 2.1 准备cfssl证书生成工具 2.2 生成Etcd证书 2.2.1 自签证书颁发机构(C ...

  3. 使用Kubespray部署Kubernetes集群

    Kubespray是Google开源的一个部署生产级别的Kubernetes服务器集群的开源项目,它整合了Ansible作为部署的工具.项目地址:https://github.com/kubernet ...

  4. 【云原生 · Kubernetes】部署Kubernetes集群

    [云原生 · Kubernetes]搭建Harbor仓库 接着上次的内容,后续来了! 在master节点执行脚本k8s_master_install.sh即可完成K8S集群的部署,具体步骤参考如下(1 ...

  5. Kubernetes---通过Ansible自动化快速部署Kubernetes集群

    Kubernetes-通过Ansible自动化快速部署Kubernetes集群 目录 Kubernetes-通过Ansible自动化快速部署Kubernetes集群 一.安装ansible 二.环境准 ...

  6. 容器编排技术 -- 使用Minikube 部署 Kubernetes 集群

    容器编排技术 -- 使用Minikube 部署 Kubernetes 集群 单机部署 创建Kubernetes cluster(单机版)最简单的方法是minikube: 首先下载kubectl cur ...

  7. 使用Rancher的RKE快速部署Kubernetes集群

    简要说明: 本文共涉及3台Ubuntu机器,1台RKE部署机器(192.168.3.161),2台Kubernetes集群机器(3.162和3.163). 先在Windows机器上,将rke_linu ...

  8. ② kubeadm快速部署Kubernetes集群

    文章目录 1. 安装要求 2. 目标 3. 准备环境 4. 所有节点安装Docker/kubeadm/kubelet 4.1 安装Docker(以一台为例,其他相同) 4.2 添加kubernetes ...

  9. RKE部署Kubernetes集群

    安装docker 在各个节点建立自定义账户,使其可以用命令操作docker useradd <user_name> passwd <user_name> usermod -aG ...

  10. 部署kubernetes集群

    在本例中使用三台机器来部署kubernetes集群 172.16.36.50 master 172.16.36.51 cti-1 172.16.36.54 cti-4 关闭三台机器的防火墙 syste ...

最新文章

  1. python映射类型有哪些_什么是python中唯一的映射类型
  2. 什么叫「真的理解」?我们对 AI 的要求或许有点过分
  3. 任正非:AI是人类社会未来二三十年最大的推动力
  4. Navicat Premium 12.0.24破解
  5. 大动作!这所“国字头”大学获批成立12个新学院
  6. 【零基础学Java】—字符串的概述和特点(十五)
  7. 蓝牙:协议/服务复用(PSM)
  8. 国外大神一张图学会python-没有接触过编程Python难学吗?
  9. android 获取网卡mac_android 获取MAC地址
  10. clickhouse 数据存储
  11. python输出文本和值_Python有没有函数打印当前对象的所有属性和值?_others_酷徒编程知识库...
  12. atitit.自适应设计悬浮图片的大小and 位置
  13. 最新版网站推广完全手册(2007年)!
  14. kvm实战之搭建一个web服务来进行ks.cfg文件的引导(三)
  15. PTA-查询水果价格
  16. 漫反射及具体光源的照明
  17. GitHub Star 13.9k,顶级项目全新开源表格识别算法
  18. 在PCB板上调试104(0.1μF)独石电容驱动MAXIM MAX3232串口芯片的心得
  19. python中heapq的库是什么_详解Python中heapq模块的用法
  20. Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1030E: The operator 'SUBTR

热门文章

  1. 第一行代码git上传天气项目遇到问题
  2. 展锐T618/T610安卓4G核心板/开发板/方案定制
  3. 【工具】批量修改文件名
  4. 【文集】Unity的热更新
  5. matlab卡方分布函数,MATLAB如何使用ncx2pdf函数计算非中心卡方分布的概率密度
  6. 企业微信消息多久可以撤回?企业微信怎么查看撤回的消息?
  7. echarts折线图常见配置项 分割线虚线样式 显示y轴符号 设置间隔
  8. 中段尾段全段什么意思_什么头什么尾?汽车改装排气时有的换全段,中尾段,尾段,分别都有什么效果?...
  9. pycharm如何增加运行时内存
  10. POJ 3164 Command Network(朱刘算法)