容器化弹性伸缩集群:kuberntes环境构建

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 1. 简介 redhat 在今年9月份发布了k8s 和 etcd 的yum 源(redhat 7),我们下面都是基于redhat 7操作系统以yum来构建k8s集群,你也可以到github 下载kubernetes 进行安装部署 下面是k8s集群架构 kubernetes 架构 2.

1. 简介 

redhat 在今年9月份发布了k8s 和 etcd 的yum 源(redhat 7),我们下面都是基于redhat 7操作系统以yum来构建k8s集群,你也可以到github 下载kubernetes 进行安装部署

下面是k8s集群架构

kubernetes 架构

kubernetes 架构

2. 集群架构部署

基本信息

#服务器分配
192.168.9.155 kubem #k8s master
192.168.9.7 kubes1 #k8s minion1
192.168.9.6 kubes2 #k8s minion2
192.168.9.209 etcd #etcd

#版本选择
etcd v2.1.1 kubernetes v1.0.3 

2.1 etcd 安装配置(etcd)

安装etcd
yum install etcd -y
配置 etcd配置文件

这里我直接使用脚本进行替换配置,也可以手工修改,主要是配置etcd地址,这里主要做演示,就不搭建etcd集群了,如果搭建etcd集群可以参考coreos doc 构建etcd集群.

注意:这里的ip变量,因为我的地址是192网段, 所以我这里简单点直接grep 192来过滤

ip=`ifconfig | grep inet | awk '{print $2}' | grep 192`
echo ''>/etc/etcd/etcd.conf
cat >/etc/etcd/etcd.conf <<EOF
ETCD_NAME=default
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://$ip:2379"
EOF
配置etcd 启动
systemctl enable etcd
systemctl start etcd

2.2 kube master 安装配置(kubem)

安装 k8s master
yum install kubernetes-master -y
配置 master默认配置
mkdir /etc/systemd/system/kube-apiserver.service.d
cat >/etc/systemd/system/kube-apiserver.service.d/10-varrun-build.conf <<EOF
[Service]
# Run ExecStartPre with root-permissions
PermissionsStartOnly=true
ExecStartPre=-/usr/bin/mkdir /var/run/kubernetes
ExecStartPre=/usr/bin/chown -R kube:kube /var/run/kubernetes/
EOF


#生成sslkey
openssl genrsa -out /tmp/serviceaccount.key 2048

#注意这里配置你的etcd ip地址
etcd_ip='192.168.9.209'

#获取本机ip地址
ip=`ifconfig | grep inet | awk '{print $2}' | grep 192`

#配置k8s master 的 apiserver,controller-manager,config文件
echo ''>/etc/kubernetes/apiserver
cat >/etc/kubernetes/apiserver <<EOF
KUBE_API_ADDRESS="--address=0.0.0.0"
KUBE_ETCD_SERVERS="--etcd_servers=http://$etcd_ip:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=192.10.11.0/16"
KUBE_ADMISSION_CONTROL="--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
KUBE_API_ARGS="--service_account_key_file=/tmp/serviceaccount.key"
EOF

echo ''>/etc/kubernetes/controller-manager 
cat >/etc/kubernetes/controller-manager <<EOF
KUBE_CONTROLLER_MANAGER_ARGS="--node-monitor-grace-period=10s --pod-eviction-timeout=10s --service_account_private_key_file=/tmp/serviceaccount.key"
EOF

echo ''>/etc/kubernetes/config 
cat >/etc/kubernetes/config <<EOF
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow_privileged=false"
KUBE_MASTER="--master=http://$ip:8080"
EOF
配置k8s master 启动
systemctl enable kube-apiserver kube-scheduler kube-controller-manager
systemctl restart kube-apiserver kube-scheduler kube-controller-manager

2.3 kube minion 安装配置(minion1,minion2)

安装 k8s minion + docker(注意k8s 2个节点都需要同样配置)
yum install kubernetes-node docker -y
配置 k8s minion配置文件
#注意:这里配置k8s master 地址,请替换自己的k8s master 地址
kube_master='192.168.9.155'

#注意: 同样注意这里的 grep 192,原因见上面
ip=`ifconfig | grep inet | grep 192 | awk '{print $2}'`


#配置 config和kubelet
echo ''>/etc/kubernetes/config
cat >/etc/kubernetes/config <<EOF
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow_privileged=false"
KUBE_MASTER="--master=http://$kube_master:8080"
EOF

echo ''>/etc/kubernetes/kubelet 
cat >/etc/kubernetes/kubelet <<EOF
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname_override=$ip"
KUBELET_API_SERVER="--api_servers=http://$kube_master:8080"
KUBELET_ARGS="--pod-infra-container-image=kubernetes/pause"
EOF
启动k8s minion + docker
systemctl enable kubelet kube-proxy docker
systemctl start docker kubelet kube-proxy

到此我们k8s集群搭建完成了,我们可以使用如下命令在k8s master执行获取nodes信息

[root@kubem py]# kubectl get nodes
NAME LABELS STATUS
192.168.9.6 kubernetes.io/hostname=192.168.9.6 Ready
192.168.9.7 kubernetes.io/hostname=192.168.9.7 Ready

2.4 使用工具quagga 配置容器间网络互通

从前面k8s集群搭建,你会看到网上搜索的k8s集群搭建容器网络互通大部分都基于flannel 来做,但这里我们使用quagga 来实现容器互通,使用quagga来做主要是觉得目前flannel通过端口转发方式实现容器互通,从性能上来看还不太理想,同时flannel本身还不够稳定,quagga的配置步奏如下:

安装brctl工具
yum install -y bridge-utils.x86_64
删除默认的docker0 网卡,并创建新的网卡kbr0
brctl addbr kbr0
ip link set dev docker0 down
ip link del dev docker0
配置kbr0 IP(我们写入一个配置文件到操作系统的网络配置目录)

这里注意:每个minion 节点配置不同的IPADDR,假设minion1 为172.11.11.1 ,则可以配置minion2为172.12.12.1,同时更改网关同步配置

cat >/etc/sysconfig/network-scripts/ifcfg-kbr0 <<EOF
DEVICE=kbr0
ONBOOT=yes
BOOTPROTO=static
IPADDR=172.11.11.1
NETMASK=255.255.255.0
GATEWAY=172.11.11.0
USERCTL=no
TYPE=Bridge
IPV6INIT=no
EOF
更改docker默认参数配置,让docker默认使用kbr0网卡
sed -i 's/selinux-enabled/selinux-enabled -b=kbr0/' /etc/sysconfig/docker
重启network和docker

注意:如果重启network 没有加载kbr0,则需要重启操作系统

systemctl restart network.service docker.sersvice 
这里有网友直接将quagga 配置好并打包为docker image,我们直接拿来使用,我们也可以自行在宿主机上安装quagga
docker pull index.alauda.cn/georce/router

#配置--restart=always 是为了让系统每次重启,docker daemon启动后自动启动该容器
docker run -itd --name=router --restart=always --privileged --net=host index.alauda.cn/georce/router
等待几秒钟,我们通过以下命令查看,可以看到route自动更新了

注意: 如果你执行命令route -n没有发现更新,你可以尝试stop 系统防火墙,再执行命令查看

[root@kubem py]# route -n 172.11.11.0 192.168.9.7 255.255.255.0 UG 2 0 0 enp0s8
172.13.13.0 192.168.9.6 255.255.255.0 UG 2 0 0 enp0s8
172.15.15.0 0.0.0.0 255.255.255.0 U 425 0 0 kbr0
172.16.16.0 192.168.9.209 255.255.255.0 UG 2 0 0 enp0s8
172.17.17.0 192.168.9.5 255.255.255.0 UG 2 0 0 enp0s8
172.18.18.0 192.168.9.8 255.255.255.0 UG 2 0 0 enp0s8
172.19.19.0 192.168.9.51 255.255.255.0 UG 2 0 0 enp0s8


#ping其他容器地址
[root@kubem py]# ping 172.13.13.8
PING 172.13.13.8 (172.13.13.8) 56(84) bytes of data.
64 bytes from 172.13.13.8: icmp_seq=1 ttl=63 time=1.11 ms
64 bytes from 172.13.13.8: icmp_seq=2 ttl=63 time=0.902 ms
64 bytes from 172.13.13.8: icmp_seq=3 ttl=63 time=0.824 ms
64 bytes from 172.13.13.8: icmp_seq=4 ttl=63 time=0.772 ms
64 bytes from 172.13.13.8: icmp_seq=5 ttl=63 time=0.888 m

3. kube-ui 安装

kubernetes 自带了一个kube-ui,用来展示kubernetes 集群状态,目前kube-ui 还比较简单,只展现了kube 节点资源使用率,rc,service,pod ,nodes 情况,默认情况下安装kubernetes 集群是没有安装kube-ui的,需要我们手工安装

注意:在安装kube-ui 之前,你需要把kube master服务器与其他kube minon 容器大二层网络互通,直接办法就是前面讲到的使用工具quagga 配置容器间网络互通这一节的流程在kube master 服务器上执行一次,可以在kube master上配置一个网卡kbr0 ,网络配置也跟其他minion节点容器网络相同域,让kube master 也能访问到kube minion 容器网络,否则kube-ui 安装好后会报无法访问minion pod地址

#####安装配置准备工作

kube-ui的docker image是在google gcr中,由于众所周知的原因,我们在国内无法访问到这个源,这里我将源下载下来放到百度云盘中,我们可以将此image 下载下来后通过docker load 命令进行导入到kube minion或者私有仓库中.

kube-ui image 国内源

同时我们要用到3个文件 分别是kube-ui rc ,svc,kube-system,这3个文件,rc和service 在kubernetes 安装包kubernetes\cluster\addons\kube-ui路径下,你可以从github下载kubernetes 获取这2个文件,kube-system 文件需要你自己定义构建,由于kubernetes 完整安装包非常大,我这里直接将这3个文件内容展示,你可以直接复制内容命名一个文件名称使用kubectl create -f 进行创建,同时这里我将kubernetes 1.1版本直接搬到了百度云上,有需要可以下载:

kuberntes 1.1版本 国内下载地址

下面是kube-ui rc,svc 和kube-system 内容,创建的顺序是kube-system-->kube-ui-rc-->kube-ui-svc

kube-system.yaml

{
 "kind": "Namespace",
 "apiVersion": "v1",
 "metadata": {
 "name": "kube-system"
 }
}

kube-ui-rc.yaml

apiVersion: v1 kind: ReplicationController metadata:
 name: kube-ui-v2
 namespace: kube-system
 labels:
 k8s-app: kube-ui
 version: v2
 kubernetes.io/cluster-service: "true" spec:
 replicas: 2
 selector:
 k8s-app: kube-ui
 version: v2
 template:
 metadata:
 labels:
 k8s-app: kube-ui
 version: v2
 kubernetes.io/cluster-service: "true"
 spec:
 containers:
 - name: kube-ui
 image: gcr.io/google_containers/kube-ui:v2
 resources:
 limits:
 cpu: 200m
 memory: 200Mi
 ports:
 - containerPort: 8080
 livenessProbe:
 httpGet:
 path: /
 port: 8080
 initialDelaySeconds: 30
 timeoutSeconds: 5

kube-ui-svc.yaml

	apiVersion: v1
	kind: Service
	metadata:
	 name: kube-ui
	 namespace: kube-system
	 labels:
	 k8s-app: kube-ui
	 kubernetes.io/cluster-service: "true"
	 kubernetes.io/name: "KubeUI"
	spec:
	 selector:
	 k8s-app: kube-ui
	 ports:
	 - port: 80
	 targetPort: 8080 

#####安装配置过程 前面的准备工作准备好以后,kube-ui的安装配置非常简单,总结为下面几步

1.执行创建kube-system

#创建kube-system
[root@km kube]# kubectl create -f kube-system.yaml 
namespaces/kube-system #检查是否创建成功
[root@km kube]# kubectl get namespace
NAME LABELS STATUS
default <none> Active
kube-system <none> Active

  1. 创建kube-ui-rc 这里再提醒一下,一定要记得把kube-ui 镜像导入到kube minion 中,否则由于无法访问gcr的源,会一直卡在这里无法running 成功,同时注意由于我们的kube-ui 是创建在kube-system namespace 中的,所有我们查找rc,pod 都需要带关键字 --namespace=kube-system--all-namespace
[root@km kube]# kubectl create -f kube-ui-rc.yaml 
replicationcontrollers/kube-ui-v2
[root@km kube]# kubectl get pods --namespace=kube-system
NAME READY STATUS RESTARTS AGE
kube-ui-v2-kv8se 1/1 Running 0 21s
kube-ui-v2-mw65q 1/1 Running 0 21s
[root@km kube]# kubectl get rc --namespace=kube-system CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS
kube-ui-v2 kube-ui gcr.io/google_containers/kube-ui:v2 k8s-app=kube-ui,version=v2 2 
  1. 创建kube-ui-svc
[root@km kube]# kubectl create -f kube-ui-svc.yaml 
services/kube-ui
[root@km kube]# kubectl get svc --namespace=kube-system NAME LABELS SELECTOR IP(S) PORT(S)
kube-ui k8s-app=kube-ui,kubernetes.io/cluster-service=true,kubernetes.io/name=KubeUI k8s-app=kube-ui 192.168.155.143 80/TCP

4.访问http://kube-master地址:8080/ui 可以看到我们kube-ui界面

4. 总结

前面的配置,基本绕过了网上的一些构建k8s集群不完整文档的坑,主要有如下几个坑

问题:

Unable to listen for secure (open /var/run/kubernetes/apiserver.crt: no such file or directory

解决:

vi /etc/systemd/system/kube-apiserver.service.d/10-varrun-build.conf
[Service]
# Run ExecStartPre with root-permissions
PermissionsStartOnly=true
ExecStartPre=-/usr/bin/mkdir /var/run/kubernetes
ExecStartPre=/usr/bin/chown -R kube:kube /var/run/kubernetes/

问题:

no API token found for service account default/default, retry after the token is automatically created and added to the service account

解决:

1. openssl genrsa -out /tmp/serviceaccount.key 2048 2.
 vim /etc/kubernetes/apiserver:
 KUBE_API_ARGS="--service_account_key_file=/tmp/serviceaccount.key" 3.
 vim /etc/kubernetes/controller-manager
 KUBE_CONTROLLER_MANAGER_ARGS="--service_account_private_key_file=/tmp/serviceaccount.key"
 systemctl restart kube-controller-manager.service

本文转移开源中国- 容器化弹性伸缩集群:kuberntes环境构建
相关文章
|
24天前
|
运维 安全 Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
在数字化转型的浪潮中,企业对于IT基础设施的要求越来越高,不仅需要快速响应市场变化,还要确保系统的稳定与安全。本文深入探讨了如何通过融合DevOps文化和容器化技术来构建一个高效、稳定且易于管理的云基础设施。通过实际案例分析,阐述了持续集成/持续部署(CI/CD)流程的优化、自动化测试、监控以及日志管理等关键环节的实施策略,旨在为运维专业人员提供一套切实可行的解决方案。
23 3
|
3月前
|
Kubernetes 容器
要获取ACK(阿里云容器服务)集群中的Deployment
要获取ACK(阿里云容器服务)集群中的Deployment【1月更文挑战第8天】【1月更文挑战第40篇】
64 4
|
28天前
|
运维 Kubernetes Devops
构建高效可靠的云基础设施:DevOps与容器化技术融合实践
【2月更文挑战第30天】 在当今快速迭代和竞争激烈的软件开发领域,传统的IT运维模式已难以满足业务发展的需要。本文将探讨如何通过整合DevOps文化和容器化技术,构建一个既高效又可靠的云基础设施。文章首先回顾了DevOps的核心理念及其对运维工作流的影响,接着深入讨论了容器化技术的优势和挑战,并提出了一套结合两者的实施方案。最后,通过案例分析展示了该方案在实际环境中的应用效果和潜在益处。
|
3月前
|
存储 Kubernetes 监控
Kubernetes快速进阶与实战:构建可靠的容器化应用平台
Kubernetes快速进阶与实战:构建可靠的容器化应用平台
92 0
|
3月前
|
Linux 开发者 Docker
如何构建在 Docker 容器中运行命令?
【1月更文挑战第6天】
54 0
|
2天前
|
运维 Kubernetes Devops
构建高效自动化运维体系:DevOps与容器技术融合实践
【4月更文挑战第15天】 在当今快速发展的信息技术时代,传统的IT运维模式已难以满足业务敏捷性的需求。本文旨在探讨如何通过整合DevOps理念和容器技术来构建一个高效的自动化运维体系。文章将详细阐述DevOps的核心原则、容器技术的基础知识,以及两者结合的优势。此外,文中还将分享一系列实践经验,包括持续集成/持续部署(CI/CD)流程的搭建、微服务架构的应用,以及监控和日志管理策略的优化,以期帮助企业实现快速、可靠且安全的软件交付过程。
|
4天前
|
运维 Devops 持续交付
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【4月更文挑战第13天】 在当今快速迭代和持续部署的软件开发环境中,传统的IT运维模式已难以满足业务发展的需求。本文聚焦于如何通过融合DevOps理念与容器化技术,构建一个高效、稳定且易于管理的云基础设施。文章将探讨持续集成/持续交付(CI/CD)流程的优化、容器化技术的最佳实践、以及微服务架构下的应用管理,以期为企业提供一种改进运维效率、加速产品上市时间,同时保障系统稳定性的解决方案。
|
21天前
|
运维 Kubernetes 监控
构建高效稳定的容器化运维环境
在现代IT基础设施中,容器技术以其轻量级、快速部署和易于管理的特性成为企业数字化转型的重要支撑。本文将深入探讨如何构建一个高效且稳定的容器化运维环境,涵盖从容器选择、集群管理到持续集成与持续部署(CI/CD)的最佳实践。文章旨在为运维工程师提供一套系统的解决方案,以应对日益复杂的业务需求和技术挑战。
|
23天前
|
运维 Kubernetes 监控
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
在当今云计算时代,企业追求敏捷性、可扩展性以及成本效益的云基础设施。本文将探讨如何通过DevOps文化与容器化技术的融合,打造一个既高效又稳定的运维环境。文章不仅阐述了DevOps和容器化技术各自的优势,还提供了一个具体的实施案例,展示了这种结合如何优化资源利用、提高部署速度并降低运维复杂性。
|
26天前
|
运维 监控 Devops
构建高效自动化运维体系:基于容器技术的持续集成与持续部署实践
在数字化转型的浪潮中,企业的IT基础设施和软件交付模式正经历着深刻的变革。传统的运维方式已难以满足快速迭代、灵活扩展的现代业务需求。本文将探讨如何通过容器技术实现高效的自动化运维体系,重点分析持续集成(CI)与持续部署(CD)的实践方法及其对企业运维效率的影响。通过引入微服务架构、容器编排、DevOps文化等概念,我们旨在为读者提供一套全面的自动化运维解决方案,以支持业务的敏捷性和可扩展性。