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
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
end
end
启动虚拟机
vagrant up
//进入虚拟机环境
vagrant ssh k8s1
vagrant ssh k8s2
vagrant ssh k8s3
#切换超级用户
su
#关闭 SE
setenforce 0
#关闭 firewalld
systemctl stop firewalld && systemctl disable firewalld
#进入三台虚拟机,更改 IP 地址为静态方式
vi /etc/sysconfig/network-scripts/ifcfg-enp0s8
BOOTPROTO=static
#重启网络服务,使三台机器可以两两互通
systemctl restart network
将此文件 yum.repo 复制到 /etc/yum.repo.d/ 目录,准备 Kubernetes 安装的软件包。
cp yum.repo /etc/yum.repo.d/
#yum.repo
[base]
name=base-repo
baseurl=http://yum.caicloud.com/base/
enabled=1
gpgcheck=0
gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7
[epel]
name=epel-repo
baseurl=http://yum.caicloud.com/epel/
enabled=1
gpgcheck=0
gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7
[extras]
name=extras-repo
baseurl=http://yum.caicloud.com/extras/
enabled=1
gpgcheck=0
gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7
[kubernetes]
name=kubernetes-repo
baseurl=http://yum.caicloud.com/kubernetes/
enabled=1
gpgcheck=0
gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7
[updates]
name=updates-repo
baseurl=http://yum.caicloud.com/updates/
enabled=1
gpgcheck=0
gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7
开始 Ansible 部署
vagrant ssh k8s1
vagrant ssh k8s2
vagrant 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 available
PLAY [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.0
docker pull registry.51yixiao.com/google_containers/kube-proxy-amd64:v1.4.0
docker pull registry.51yixiao.com/google_containers/kube-apiserver-amd64:v1.4.0
docker pull registry.51yixiao.com/google_containers/kube-scheduler-amd64:v1.4.0
docker pull registry.51yixiao.com/google_containers/kube-discovery-amd64:1.0
docker pull registry.51yixiao.com/google_containers/kubedns-amd64:1.7
docker pull registry.51yixiao.com/google_containers/exechealthz-amd64:1.1
docker pull registry.51yixiao.com/google_containers/kube-dnsmasq-amd64:1.3
docker pull registry.51yixiao.com/google_containers/pause-amd64:3.0
docker 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.0
docker tag registry.51yixiao.com/google_containers/kube-proxy-amd64:v1.4.0 gcr.io/google_containers/kube-proxy-amd64:v1.4.0
docker tag registry.51yixiao.com/google_containers/kube-apiserver-amd64:v1.4.0 gcr.io/google_containers/kube-apiserver-amd64:v1.4.0
docker tag registry.51yixiao.com/google_containers/kube-scheduler-amd64:v1.4.0 gcr.io/google_containers/kube-scheduler-amd64:v1.4.0
docker tag registry.51yixiao.com/google_containers/kube-discovery-amd64:1.0 gcr.io/google_containers/kube-discovery-amd64:1.0
docker tag registry.51yixiao.com/google_containers/kubedns-amd64:1.7 gcr.io/google_containers/kubedns-amd64:1.7
docker tag registry.51yixiao.com/google_containers/exechealthz-amd64:1.1 gcr.io/google_containers/exechealthz-amd64:1.1
docker tag registry.51yixiao.com/google_containers/kube-dnsmasq-amd64:1.3 gcr.io/google_containers/kube-dnsmasq-amd64:1.3
docker tag registry.51yixiao.com/google_containers/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0
docker 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.2
docker 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.2
docker tag registry.51yixiao.com/weaveworks/weave-npc:1.7.2 weaveworks/weave-npc:1.7.2
Master 节点:
gcr.io/google_containers/kube-controller-manager-amd64:v1.4.0
gcr.io/google_containers/kube-proxy-amd64:v1.4.0
gcr.io/google_containers/kube-apiserver-amd64:v1.4.0
gcr.io/google_containers/kube-scheduler-amd64:v1.4.0
gcr.io/google_containers/kube-discovery-amd64:1.0
gcr.io/google_containers/kubedns-amd64:1.7
gcr.io/google_containers/exechealthz-amd64:1.1
gcr.io/google_containers/kube-dnsmasq-amd64:1.3
gcr.io/google_containers/pause-amd64:3.0
gcr.io/google_containers/etcd-amd64:2.2.5
weaveworks/weave-kube:1.7.2
weaveworks/weave-npc:1.7.2
Node 节点:
gcr.io/google_containers/kube-proxy-amd64:v1.4.0
gcr.io/google_containers/pause-amd64:3.0
weaveworks/weave-kube:1.7.2
weaveworks/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 available
PLAY [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-system
NAME READY STATUS RESTARTS AGE
etcd-k8s1 1/1 Running 0 5m
kube-apiserver-k8s1 1/1 Running 3 5m
kube-controller-manager-k8s1 1/1 Running 1 6m
kube-discovery-982812725-uz406 1/1 Running 0 6m
kube-dns-2247936740-s412w 0/3 ContainerCreating 0 6m
kube-proxy-amd64-2228u 1/1 Running 0 2m
kube-proxy-amd64-3um33 1/1 Running 0 6m
kube-proxy-amd64-945s5 1/1 Running 0 2m
kube-scheduler-k8s1 1/1 Running 1 5m
weave-net-i4qk7 2/2 Running 0 28s
weave-net-k12m3 2/2 Running 0 28s
weave-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 available
PLAY [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 node
NAME STATUS AGE
k8s1 Ready 49m
k8s2 Ready 45m
k8s3 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-system
NAME READY STATUS RESTARTS AGE
etcd-k8s1 1/1 Running 0 54m
kube-apiserver-k8s1 1/1 Running 3 55m
kube-controller-manager-k8s1 1/1 Running 1 55m
kube-discovery-982812725-uz406 1/1 Running 0 55m
kube-dns-2247936740-s412w 3/3 Running 1 55m
kube-proxy-amd64-2228u 1/1 Running 0 51m
kube-proxy-amd64-3um33 1/1 Running 0 55m
kube-proxy-amd64-945s5 1/1 Running 0 51m
kube-scheduler-k8s1 1/1 Running 1 54m
weave-net-i4qk7 2/2 Running 0 49m
weave-net-k12m3 2/2 Running 0 49m
weave-net-vh456 2/2 Running 0 49m
本文转载自才云 Caicloud 公众号。
原文链接:https://mp.weixin.qq.com/s/jLVF4hQ0J8DFMF1L5xXAdw
更多内容推荐
Kubernetes 本地持久化存储方案 OpenEBS LocalPV 落地实践下——原理篇
本篇文章我将讲解 OpenEBS Device-LocalPV 实现原理,如果还不了解了 OpenEBS Device-LocalPV 如何使用,可以移步至本系列上篇文章 Kubernetes 本地持久化存储方案 OpenEBS LocalPV 落地实践上——使用篇 进行学习。
2023-04-13
5.Docker 实战
2023-09-30
Linux 网络 - 基础概念
本章将开始对Linux网络编程进行系统的学习,而这篇主要学习网络的基本知识
2022-10-24
NFT 数字藏品交易平台 APP 开发搭建
为什么以太坊网络在NFT项目中如此受欢迎呢?NFT发行铸造交易平台开发让我们来一探究竟。NFT开发薇芯hkkf5566
2022-07-13
网络性能测试工具
2022-05-31
Kubernetes 中容器跨主机网络是怎么样的?
在云原生领域,Kubernetes 已经成为了最主流的容器管理工具。Kubernetes 支持将容器部署到多个节点(即主机)上,因此必须解决容器间跨主机通信的问题。
2023-04-13
多容器部署:如何利用 Docker Compose 快速搭建本地爬虫环境?
这节课,我们一起来学习如何使用 Docker Compose 来部署多个容器。
2023-02-07
web 前端开发培训学习后的就业方向
前端开发培训学习后的就业方向是什么?随着5G网络的不断普及,有越来越多的新场景需要前端开发技术来实现,前端开发市场的不断发展对开发技术人才的需求量在不断的增多,同时,有越来越多的小伙伴想要通过前端培训机构学习来成功转行,但是有些小伙伴不知道选
2022-10-14
易观分析:2022 年 Q3 中国网络零售 B2C 市场交易规模达 21971.5 亿元
2022年第三季度中国网络零售B2C市场交易规模同比增长4.0%。
2022-11-17
21|应用定义:如何使用 Helm 定义应用?
这节课,我们还是以示例应用为例子,把它从原始的 Kubernetes Manifest 改造成 Helm 应用。
2023-01-25
53|容器化实战:怎样搭建 K8s 爬虫集群?
这节课让我们把爬虫项目相关的微服务部署到 Kubernetes 中。
2023-02-11
SRv6 网络典型部署场景
SRv6可以应用于单个网络域,如IP骨干网、城域网、移动承载网和数据中心等单自治域网络,也可以应用于端到端网络,如跨域VPN和运营商的运营商。
2022-08-05
部署 PKI 和证书服务
了解什么是PKI/CA
2022-11-20
11-FastDFS 部署与使用
2023-09-28
500 代码行代码手写 docker- 设置网络命名空间
本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似docker的容器化功能,最终能够容器化的运行一个进程。
2023-05-29
50|不可阻挡的容器化:Docker 核心技术与原理
这节课,我们来看看容器化技术,并利用Docker将我们的程序打包为容器。
2023-02-04
全景剖析阿里云容器网络数据链路(四):Terway IPVLAN+EBPF
本文是[全景剖析容器网络数据链路]第四部分部分,主要介绍Kubernetes Terway EBPF+IPVLAN模式下,数据面链路的转转发链路。
2023-02-09
功能强大的开源网络监控工具:LibreNMS,牛逼!
本文介绍了 LibreNMS网络监控工具,从安装和配置到功能和使用。
2022-11-12
Docker 实践经验(六):Docker 网络
开卷有益,愿者上钩
2022-05-30
推荐阅读
加餐|尝鲜 Gateway API:更强大、更灵活、面向未来的 Ingress
2023-11-20
33|环境:基于 GraalVM 的 JVM 云原生环境搭建
2023-11-13
35|实现:基于 JDK 17、Spring Boot 3、Spring 6 打造云原生 Java 应用
2023-11-17
【鸿蒙生态学堂 _06】网络和数据存储
企业网站建设怎么做?
2023-11-23
三层开发
2023-12-04
NFT 艺术品交易所系统开发 [定制部署,1 周上线]
2023-09-24
电子书
大厂实战PPT下载
换一换 崔通 | 快手 客户端基础架构负责人
陈智伟 | 腾讯 专家工程师
江凯 | 蚂蚁集团 支付宝体验技术部/高级前端技术专家
评论 1 条评论