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
更多内容推荐
20|应用定义:如何使用 Kustomize 定义应用?
这节课,我会以示例应用为例,把它从原始的 Kubernetes Manifest 改造成 Kustomize 的应用定义方式。在实践的过程中,带你了解如何使用 Kustomize 来应用定义。
2023-01-23
局域网与 Kubernetes 内部网络如何互通
K8S搭建完毕之后,碰到个问题,如何进行远程debug(别在生产环境远程debug哦)?那就需要打通局域网和K8S内部网络了。本文主要介绍Pod通信、K8S网络插件、局域网和K8S网络如何打通。
2023-08-12
复习前端:前端应掌握的网络知识
2023年大年初三,继续学习。今天来复习与前端开发相关的一些网络知识,简单介绍网络七层模型 OSI、HTTPS状态码、GET和POST方法区别、HTTP/1.0和HTTP/1.1有什么区别等。
2023-01-24
Kubernetes:快速入门指南
原文作者:NGINX
2023-07-12
GaussDB(DWS) 网络调度与隔离管控能力
调度算法是调度器的核心,设计调度算法要充分考虑业务场景和用户需求,没有万能的调度算法,只有合适的调度算法。
2023-04-04
华为云 CDN,为你开启更快速的上网体验!
你有没有因为在家中上网不安全而烦恼过?你是否发现,在网络上看电影或者玩游戏时,手机突然卡顿或关机等等现象频频出现?你是否觉得网络信号不好,无法正常接收到文字内容或图片等重要讯息?
2022-11-30
21|应用定义:如何使用 Helm 定义应用?
这节课,我们还是以示例应用为例子,把它从原始的 Kubernetes Manifest 改造成 Helm 应用。
2023-01-25
18|自托管构建:如何使用 Tekton 构建镜像?
这节课,我们来介绍其中一种自动构建镜像的自托管方案:使用 Tekton 来自动构建镜像。
2023-01-18
50|不可阻挡的容器化:Docker 核心技术与原理
这节课,我们来看看容器化技术,并利用Docker将我们的程序打包为容器。
2023-02-04
多容器部署:如何利用 Docker Compose 快速搭建本地爬虫环境?
这节课,我们一起来学习如何使用 Docker Compose 来部署多个容器。
2023-02-07
易观分析:2022 年 Q3 中国网络零售 B2C 市场交易规模达 21971.5 亿元
2022年第三季度中国网络零售B2C市场交易规模同比增长4.0%。
2022-11-17
经济复苏正当时,云网络如何加速企业效率提升?
极客有约本期栏目特别邀请到了阿里云智能云网络产品线总经理、阿里巴巴达摩院XG实验室负责人祝顺民(江鹤),一起来聊聊《经济复苏正当时,云网络如何加速企业效率提升?》
500 代码行代码手写 docker- 设置网络命名空间
本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似docker的容器化功能,最终能够容器化的运行一个进程。
2023-05-29
Linux 网络 - 基础概念
本章将开始对Linux网络编程进行系统的学习,而这篇主要学习网络的基本知识
2022-10-24
Kubernetes 中容器跨主机网络是怎么样的?
在云原生领域,Kubernetes 已经成为了最主流的容器管理工具。Kubernetes 支持将容器部署到多个节点(即主机)上,因此必须解决容器间跨主机通信的问题。
2023-04-13
19|自托管构建:如何使用 Harbor 搭建企业级镜像仓库?
这节课,我们来学习如何使用 Harbor 来搭建企业级的镜像仓库。
2023-01-20
2023-06-10:给定一个由 n 个节点组成的网络,用 n x n 个邻接矩阵 graph 表示 在节点网络中,只有当 graph[i][j] = 1 时,节点 i 能够直接连接到另一个节点 j。
2023-06-10:给定一个由 n 个节点组成的网络,用 n x n 个邻接矩阵 graph 表示
2023-06-10
【高危】Kubernetes Windows 节点 kubernetes-csi-proxy 提权漏洞 (CVE-2023-3893)
墨知是国内首个专注软件供应链安全领域的技术社区,社区致力于为国内数百万技术人员提供全方位的软件供应链安全专业知识内容,包括软件供应链安全技术、漏洞情报、开源组件安全、SBOM、软件成分分析(SCA)、开源许可证合规等前沿技术及最佳实践。
2023-08-25
推荐阅读
app 开发
2023-12-08
17|组件监控:Kubernetes Node 组件的关键指标与数据采集
2023-02-15
53|容器化实战:怎样搭建 K8s 爬虫集群?
2023-02-11
加餐|尝鲜 Gateway API:更强大、更灵活、面向未来的 Ingress
2023-11-20
技术分享| anyRTC 之 RTN 网络
2023-11-21
高防服务器怎么防御?
2023-11-09
app 开发
2023-12-09
电子书
大厂实战PPT下载
换一换 王益为 | 秘塔网络科技 首席运营官
刘达 | 蚂蚁集团 高级开发工程师
卢俊希 | 阿里巴巴 大淘宝运营工作台前端负责人
评论 1 条评论