写点什么

Ansible+Vagrant 本地部署 Kubernetes 1.4

  • 2020-03-13
  • 本文字数:8072 字

    阅读完需:约 26 分钟

Ansible+Vagrant 本地部署 Kubernetes 1.4

Kubernetes 作为领先的容器集群管理工具,很多初学者都希望能第一时间学习使用它,但由于国内访问国外镜像站点很慢,部署一直是广大初学者的痛点。之前我们基于官方的安装文档分享过 Kubernetes 1.4 在阿里云美西节点的部署过程,本篇在上次分享的基础上更进一步,通过把相关镜像和软件安装源部署到内网,演示 Ansible 在 vagrant 上部署 K8S 的过程。

上篇(点击查看)我们介绍了 Kubernetes 1.4 在阿里云美西节点的部署过程,由于国内网络问题,很多留言表示并不通用,因此才有此下篇介绍本地部署 K8S 1.4 的具体方法。


Ansible 是一个简单的自动化运维工具,主要用于配置管理和应用部署,功能类似于目前业界的配置管理工具 Chef,Puppet,Saltstack。Ansible 是通过 Python 语言开发。Ansible 平台由 Michael DeHaan 创建,他同时也是知名软件 Cobbler 与 Func 的作者。


Ansible 的第一个版本发布于 2012 年 2 月。Ansible 默认通过 SSH 协议管理机器,所以 Ansible 不需要安装客户端程序在服务器上。您只需要将 Ansible 安装在一台服务器,在 Ansible 安装完后,您就可以去管理控制其它服务器。不需要为它配置数据库,Ansible 不会以 daemons 方式来启动或保持运行状态,因此使用非常方便,所以这里用它来部署 K8S 1.4 测试环境,具体来讲 Ansible 可以实现以下目标:


  • 自动化部署应用

  • 自动化管理配置

  • 自动化的持续交付

  • 自动化的(AWS)云服务管理。

  • 从 1.3 开始支持新的资源类型 DaemonSet,kube-scheduler,kube-apiserver,kube-controller-manager,kube-proxy,kube-discovery 都已经放入 POD 中,使用更加方便了,上文提到 Kubernetes 1.4 的新功能是引入了 kubeadm 部署机制(暂时还是 alpha 版本),简化了 Kubernetes 集群的构建,我们部署一个 K8S 集群只要如下四个步骤,通过 Ansible 部署会更加简单,只要二步就 OK。


安装 docker、kubelet、kubectl、kubeadm


  • docker 容器运行环境

  • kubelet 集群最核心组件,它运行在所有集群中的机器,并实际操作 POD 和容器

  • kubectl 交互命令行控制集群

  • kubeadm Kubernetes 1.4 新增,替换之前的 kube-up.sh 脚本,用于集群的创建和节点的增加

  • kubeadm init 初始化 master

  • kubeadm join --token

  • 部署 POD 网络


之前和网友交流过,有些网友已经本地部署成功了,具体部署代码可以从我的 github 下载,下面开始我们的本地部署过程。

准备

准备三台虚拟机


  • 硬件配置: 三台 CPU1 核 内存 1.5 G 机器-需要可以访问国内网络(Ansible 安装和国内镜像下载需要)

  • 操作系统:Centos 7.2

  • 代码库-https://github.com/MarkThink/kubernetes1.4

  • Vagrant 配置文件 Vagrantfile:


# -*- mode: ruby -*-# # vi: set ft=ruby :
boxes = { ubuntu: "ubuntu/xenial64", centos: "centos7.2",}
distro = :centos # :ubuntu
Vagrant.configure(2) do |config|
(1..3).each do |i| config.vm.define "k8s#{i}" do |s| s.ssh.forward_agent = true s.vm.box = boxes[distro] s.vm.hostname = "k8s#{i}" s.vm.provision :shell, path: "scripts/bootstrap_ansible_#{distro.to_s}.sh" n = 10 + i s.vm.network "private_network", ip: "172.42.42.#{n}", netmask: "255.255.255.0", auto_config: true, virtualbox__intnet: "k8s-net" s.vm.provider "virtualbox" do |v| v.name = "k8s#{i}" v.memory = 1536 v.gui = false end end end
if Vagrant.has_plugin?("vagrant-cachier") config.cache.scope = :box endend
复制代码


启动虚拟机


vagrant up//进入虚拟机环境vagrant ssh k8s1vagrant ssh k8s2vagrant ssh k8s3#切换超级用户su#关闭 SEsetenforce 0#关闭 firewalldsystemctl stop firewalld && systemctl disable firewalld#进入三台虚拟机,更改 IP 地址为静态方式vi /etc/sysconfig/network-scripts/ifcfg-enp0s8BOOTPROTO=static#重启网络服务,使三台机器可以两两互通systemctl restart network
复制代码


将此文件 yum.repo 复制到 /etc/yum.repo.d/ 目录,准备 Kubernetes 安装的软件包。


cp yum.repo /etc/yum.repo.d/ #yum.repo[base]name=base-repobaseurl=http://yum.caicloud.com/base/enabled=1gpgcheck=0gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7[epel]name=epel-repobaseurl=http://yum.caicloud.com/epel/enabled=1gpgcheck=0gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7[extras]name=extras-repobaseurl=http://yum.caicloud.com/extras/enabled=1gpgcheck=0gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7[kubernetes]name=kubernetes-repobaseurl=http://yum.caicloud.com/kubernetes/enabled=1gpgcheck=0gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7[updates]name=updates-repobaseurl=http://yum.caicloud.com/updates/enabled=1gpgcheck=0gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7
复制代码

开始 Ansible 部署

vagrant ssh k8s1vagrant ssh k8s2vagrant ssh k8s3#切换超级用户su#使用 Ansible 安装 K8S 基础环境ansible-playbook /vagrant/ansible/k8s-base.yml -c local
复制代码


这会完成 docker、kubelet、kubectl、kubeadm 的安装,日志如下:


[WARNING]: provided hosts list is empty, only localhost is availablePLAY [localhost] ***************************************************************TASK [setup] *******************************************************************ok: [localhost]TASK [k8s-base : Ensure SSH Directories] ***************************************skipping: [localhost]TASK [k8s-base : Copy SSH Key Files] *******************************************skipping: [localhost] => (item=id_rsa)skipping: [localhost] => (item=id_rsa.pub)skipping: [localhost] => (item=config)TASK [k8s-base : Ensure Authorized SSH Key] ************************************skipping: [localhost]TASK [k8s-base : Remove Default Host Entry] ************************************changed: [localhost]TASK [k8s-base : Ensure Hosts File] ********************************************changed: [localhost] => (item={u'ip': u'172.42.42.11', u'name': u'k8s1'})changed: [localhost] => (item={u'ip': u'172.42.42.12', u'name': u'k8s2'})changed: [localhost] => (item={u'ip': u'172.42.42.13', u'name': u'k8s3'})TASK [k8s-base : Ensure Kubernetes APT Key] ************************************skipping: [localhost]TASK [k8s-base : Ensure Kubernetes APT Repository] *****************************skipping: [localhost]TASK [k8s-base : Ensure Base Kubernetes] ***************************************skipping: [localhost] => (item=[])TASK [k8s-base : file] *********************************************************changed: [localhost]TASK [k8s-base : Ensure Base Kubernetes] ***************************************changed: [localhost] => (item=[u'docker', u'kubelet', u'kubeadm', u'kubectl', u'kubernetes-cni'])TASK [k8s-base : Ensure docker.service] ****************************************changed: [localhost]TASK [k8s-base : Ensure kubelet.service] ***************************************changed: [localhost]TASK [k8s-base : Ensure firewalld.service] *************************************changed: [localhost]TASK [k8s-base : firewalld] ****************************************************changed: [localhost]TASK [k8s-base : firewalld] ****************************************************changed: [localhost]TASK [k8s-base : firewalld] ****************************************************changed: [localhost]TASK [k8s-base : firewalld] ****************************************************changed: [localhost]TASK [k8s-base : firewalld] ****************************************************changed: [localhost]TASK [k8s-base : command] ******************************************************changed: [localhost]PLAY RECAP *********************************************************************localhost                  : ok=14   changed=13   unreachable=0    failed=0
复制代码


由于网络问题,这里已经准备了相应的镜像:


docker pull registry.51yixiao.com/google_containers/kube-controller-manager-amd64:v1.4.0docker pull registry.51yixiao.com/google_containers/kube-proxy-amd64:v1.4.0docker pull registry.51yixiao.com/google_containers/kube-apiserver-amd64:v1.4.0docker pull registry.51yixiao.com/google_containers/kube-scheduler-amd64:v1.4.0docker pull registry.51yixiao.com/google_containers/kube-discovery-amd64:1.0docker pull registry.51yixiao.com/google_containers/kubedns-amd64:1.7docker pull registry.51yixiao.com/google_containers/exechealthz-amd64:1.1docker pull registry.51yixiao.com/google_containers/kube-dnsmasq-amd64:1.3docker pull registry.51yixiao.com/google_containers/pause-amd64:3.0docker pull registry.51yixiao.com/google_containers/etcd-amd64:2.2.5
复制代码


镜像前缀修改:


docker tag registry.51yixiao.com/google_containers/kube-controller-manager-amd64:v1.4.0 gcr.io/google_containers/kube-controller-manager-amd64:v1.4.0docker tag registry.51yixiao.com/google_containers/kube-proxy-amd64:v1.4.0 gcr.io/google_containers/kube-proxy-amd64:v1.4.0docker tag registry.51yixiao.com/google_containers/kube-apiserver-amd64:v1.4.0 gcr.io/google_containers/kube-apiserver-amd64:v1.4.0docker tag registry.51yixiao.com/google_containers/kube-scheduler-amd64:v1.4.0 gcr.io/google_containers/kube-scheduler-amd64:v1.4.0docker tag registry.51yixiao.com/google_containers/kube-discovery-amd64:1.0 gcr.io/google_containers/kube-discovery-amd64:1.0docker tag registry.51yixiao.com/google_containers/kubedns-amd64:1.7 gcr.io/google_containers/kubedns-amd64:1.7docker tag registry.51yixiao.com/google_containers/exechealthz-amd64:1.1 gcr.io/google_containers/exechealthz-amd64:1.1docker tag registry.51yixiao.com/google_containers/kube-dnsmasq-amd64:1.3 gcr.io/google_containers/kube-dnsmasq-amd64:1.3docker tag registry.51yixiao.com/google_containers/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0docker tag registry.51yixiao.com/google_containers/etcd-amd64:2.2.5 gcr.io/google_containers/etcd-amd64:2.2.5
复制代码


准备 POD 网络镜像:


docker pull registry.51yixiao.com/weaveworks/weave-kube:1.7.2docker pull registry.51yixiao.com/weaveworks/weave-npc:1.7.2
复制代码


镜像前缀修改:


docker tag registry.51yixiao.com/weaveworks/weave-kube:1.7.2 weaveworks/weave-kube:1.7.2docker tag registry.51yixiao.com/weaveworks/weave-npc:1.7.2 weaveworks/weave-npc:1.7.2Master 节点:
gcr.io/google_containers/kube-controller-manager-amd64:v1.4.0gcr.io/google_containers/kube-proxy-amd64:v1.4.0gcr.io/google_containers/kube-apiserver-amd64:v1.4.0gcr.io/google_containers/kube-scheduler-amd64:v1.4.0gcr.io/google_containers/kube-discovery-amd64:1.0gcr.io/google_containers/kubedns-amd64:1.7gcr.io/google_containers/exechealthz-amd64:1.1gcr.io/google_containers/kube-dnsmasq-amd64:1.3gcr.io/google_containers/pause-amd64:3.0gcr.io/google_containers/etcd-amd64:2.2.5
weaveworks/weave-kube:1.7.2weaveworks/weave-npc:1.7.2
复制代码


Node 节点:


gcr.io/google_containers/kube-proxy-amd64:v1.4.0gcr.io/google_containers/pause-amd64:3.0weaveworks/weave-kube:1.7.2weaveworks/weave-npc:1.7.2
复制代码


查看镜像数量(Master 节点 10 个镜像 Node 节点 2 个镜像):


docker images|grep gcr.io|wc -l
复制代码

Setup1. 开始部署 Master 节点

这里以 K8S1 节点作为 Master 节点,执行下面的命令,完成 Master 部署:


ansible-playbook /vagrant/ansible/k8s-master.yml -c local
复制代码


日志信息:


[WARNING]: provided hosts list is empty, only localhost is availablePLAY [localhost] ***************************************************************TASK [setup] *******************************************************************ok: [localhost]TASK [k8s-master : Ensure kubeadm initialization] ******************************changed: [localhost]TASK [k8s-master : Ensure Network Start Script] ********************************ok: [localhost] => (item=start-weave)ok: [localhost] => (item=start-calico)ok: [localhost] => (item=start-canal)TASK [k8s-master : Ensure jq package is installed] *****************************skipping: [localhost] => (item=[])TASK [k8s-master : Ensure jq package is installed] *****************************changed: [localhost] => (item=[u'jq'])TASK [k8s-master : Set --advertise-address flag in kube-apiserver static pod manifest (workaround for https://github.com/kubernetes/kubernetes/issues/34101)] ***changed: [localhost]TASK [k8s-master : Set --cluster-cidr flag in kube-proxy daemonset (workaround for https://github.com/kubernetes/kubernetes/issues/34101)] ***changed: [localhost]TASK [k8s-master : firewalld] **************************************************changed: [localhost]TASK [k8s-master : firewalld] **************************************************changed: [localhost]TASK [k8s-master : command] ****************************************************changed: [localhost]PLAY RECAP *********************************************************************localhost                  : ok=9    changed=7    unreachable=0    failed=0
复制代码


生成的配置文件列表:


# 证书/etc/kubernetes/pki/apiserver-key.pem/etc/kubernetes/pki/apiserver.pem/etc/kubernetes/pki/apiserver-pub.pem/etc/kubernetes/pki/ca-key.pem/etc/kubernetes/pki/ca.pem/etc/kubernetes/pki/ca-pub.pem/etc/kubernetes/pki/sa-key.pem/etc/kubernetes/pki/sa-pub.pem/etc/kubernetes/pki/tokens.csv# Master 配置/etc/kubernetes/manifests/kube-scheduler.json/etc/kubernetes/manifests/kube-controller-manager.json/etc/kubernetes/manifests/kube-apiserver.json/etc/kubernetes/manifests/etcd.json# kubelet 配置/etc/kubernetes/admin.conf/etc/kubernetes/kubelet.conf#查看启动配置ps aux|grep kubelet #输出日志/usr/bin/kubelet --kubeconfig=/etc/kubernetes/kubelet.conf --require-kubeconfig=true --pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --cluster-dns=100.64.0.10 --cluster-domain=cluster.local --v=4
复制代码


由于 POD 网络未配置,kube-dns 未启动:


[root@k8s1 files]# kubectl get po --namespace=kube-systemNAME                             READY     STATUS              RESTARTS   AGEetcd-k8s1                        1/1       Running             0          5mkube-apiserver-k8s1              1/1       Running             3          5mkube-controller-manager-k8s1     1/1       Running             1          6mkube-discovery-982812725-uz406   1/1       Running             0          6mkube-dns-2247936740-s412w        0/3       ContainerCreating   0          6mkube-proxy-amd64-2228u           1/1       Running             0          2mkube-proxy-amd64-3um33           1/1       Running             0          6mkube-proxy-amd64-945s5           1/1       Running             0          2mkube-scheduler-k8s1              1/1       Running             1          5mweave-net-i4qk7                  2/2       Running             0          28sweave-net-k12m3                  2/2       Running             0          28sweave-net-vh456                  2/2       Running             0          28s
复制代码

Setup2. 添加 work 节点

k8s2/k8s3 设置为工作节点,执行下面的命令:
ansible-playbook /vagrant/ansible/k8s-worker.yml -c local [root@k8s2 ~]# ansible-playbook /vagrant/ansible/k8s-worker.yml -c local [WARNING]: provided hosts list is empty, only localhost is availablePLAY [localhost] ***************************************************************TASK [setup] *******************************************************************ok: [localhost]TASK [k8s-worker : Join Kubernetes Cluster] ************************************changed: [localhost]PLAY RECAP *********************************************************************localhost : ok=2 changed=1 unreachable=0 failed=0
复制代码


查看节点状态:


[root@k8s1 files]# kubectl get nodeNAME      STATUS    AGEk8s1      Ready     49mk8s2      Ready     45mk8s3      Ready     45m
复制代码

Setup3. 部署 Pod 网络

**Kubernetes 1.2 版本默认使用的是 flannel 网络,用于解决 POD 跨主机之间的通信。新版本未提供默认的网络插件,在部署应用集群之前,必须要配置 POD 网络。


未配置 POD 网络,默认的 KUBE-DNS 是无法启动的。这里使用 weave 网络方案,当然也可以使用 Calico 或 Canal。


在 Master 节点执行下面的命令安装 POD 网络:**


[root@k8s1 files]# pwd/vagrant/ansible/roles/k8s-master/files[root@k8s1 files]# ./start-weave
复制代码


查看部署 POD:


[root@k8s1 files]# kubectl get po --namespace=kube-systemNAME                             READY     STATUS    RESTARTS   AGEetcd-k8s1                        1/1       Running   0          54mkube-apiserver-k8s1              1/1       Running   3          55mkube-controller-manager-k8s1     1/1       Running   1          55mkube-discovery-982812725-uz406   1/1       Running   0          55mkube-dns-2247936740-s412w        3/3       Running   1          55mkube-proxy-amd64-2228u           1/1       Running   0          51mkube-proxy-amd64-3um33           1/1       Running   0          55mkube-proxy-amd64-945s5           1/1       Running   0          51mkube-scheduler-k8s1              1/1       Running   1          54mweave-net-i4qk7                  2/2       Running   0          49mweave-net-k12m3                  2/2       Running   0          49mweave-net-vh456                  2/2       Running   0          49m
复制代码


本文转载自才云 Caicloud 公众号。


原文链接:https://mp.weixin.qq.com/s/jLVF4hQ0J8DFMF1L5xXAdw


2020-03-13 19:00848

评论 1 条评论

发布
用户头像
作者的 Github 仓库是 3 年前的,这里有一篇更全面:https://github.com/kubernetes/kubernetes-anywhere

我最近也在尝试利用 Ansible 本地安装,但是方法不一样,碰到了 kubelet 在容器运行中的问题,我的仓库是:
https://github.com/caryyu/kubernetes-study/

2020-03-14 11:07
回复
没有更多了
发现更多内容

Webpack最佳实践

Geek_02d948

webpack

说说Nodejs高并发的原理

coder2028

node.js

CleanMyMac2024MACOS老牌清理软件

茶色酒

CleanMyMac CleanMyMac2024

React高级特性之Render Props

夏天的味道123

React

redux原理是什么

xiaofeng

React

react组件深度解读

xiaofeng

React

圆桌实录 | 为什么不约而同选择了大 Kernel

MegEngineBot

深度学习 开源 MegEngine 大 Kernel

react-Suspense工作原理分析

夏天的味道123

React

云图说丨什么是应用身份管理服务OneAccess

华为云开发者联盟

云计算 后端 华为云 12 月 PK 榜

Vue实战必会的几个技巧

yyds2026

Vue

【敏捷研发系列】前端DevOps流水线实践

京东科技开发者

敏捷 前端 软件开发 运维‘ #DevOps

FL Studio2024最新绿色版水果萝卜编曲软件

茶色酒

FL Studio FL Studio21 FL Studio2024

细说nodejs的path模块

coder2028

node.js

PAI-Diffusion模型来了!阿里云机器学习团队带您徜徉中文艺术海洋

阿里云大数据AI技术

机器学习 算法 图文生成 12 月 PK 榜

软件测试 | Github 必会高频基础命令与 IDE 的 Git 集成

测试人

GitHub 软件测试 自动化测试 测试开发

JS知识点梳理之作用域、作用域链、柯里化、闭包

hellocoder2029

JavaScript

细说Js中的this

hellocoder2029

JavaScript

link和import的区别

达摩

Webpack构建速度优化

Geek_02d948

webpack

细说js变量、作用域和垃圾回收

hellocoder2029

JavaScript

OpenHarmony社区运营报告(2022年11月)

OpenHarmony开发者

OpenHarmony

世界杯火爆进行,中科极光真激光电视解锁缤纷观赛季

硬科技星球

react进阶用法完全指南

xiaofeng

React

Vue响应式系统原理并实现一个双向绑定

yyds2026

Vue

可观测性之Micrometer Tracing

宋小生

全链路监控 可观测性 链路追踪 micrometer 全链路

kubernetes 1.26发布,这十项新特性值得关注!

BoCloud博云

Kubernetes 云原生

Vue响应式依赖收集原理分析-vue高级必备

yyds2026

Vue

Webpack配置实战

Geek_02d948

webpack

程序员最关心的问题,我都帮你们问AI了

大白给小白讲故事

AI写代码

阿里云携手百奥利盟发布云上精准医疗与创新生物药数字化解决方案,助力行业数字化转型

云布道师

阿里云

鸿蒙开发实例 | 为什么选择HarmonyOS?

TiAmo

华为 鸿蒙 华为云 12月月更

Ansible+Vagrant 本地部署 Kubernetes 1.4_行业深度_才云科技_InfoQ精选文章