首页 > 编程知识 正文

k8s多节点集群搭建,kubernetes支持节点数

时间:2023-05-06 20:51:22 阅读:189153 作者:20

Kubernetes 是Google的一种基于容器的开源服务编排解决方案,在我们进行Kubernetes的学习前,为了对Kubernetes的工作有一个大概的认识, 我们需要先安装一个单节点的实例服务,用于平常的开发与测试。在官网 中,有各种各样的搭建方式,但这里我们想要有更贴近实际的例子,只有这样才能让docker和k8s体现出关系的紧密。

我们先看k8s的架构图,以便对它的部署有个直观的了解

环境准备

本文的例子是基于Centos 7的Linux版本,省去了网络Fannel的安装与配置,只做基本通用的开发环境搭建。

yum源配置

为了让国内下载etcd和kubernetes更流畅,我们先切换阿里云的yum源

$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo$ yum makecache 关闭防火墙服务

centos7 默认使用firewall为防火墙,而Kubernetes的Master与工作Node之间会有大量的网络通信,安全的做法是在防火墙上配置各种需要相互通讯的端口号,在一个安全的内部网络环境中可以关闭防火墙服务;

这里我们将其更改为iptables,具体步骤如下:

$ systemctl disable firewalld.service$ systemctl stop firewalld.service 安装iptables,其操作为: $ yum install -y iptables-services$ systemctl start iptables.service$ systemctl enable iptables.service 安装etcd和Kubernetes软件(docker会在安装kubernetes的过程中被安装) $ yum install -y etcd kubernetes 修改配置

安装完服务组件后,我们需要修改相关的配置

Docker配置文件 /etc/sysconfig/docker,其中的OPTIONS的内容设置为:

$ vim /etc/sysconfig/dockerOPTIONS='--selinux-enabled=false --insecure-registry gcr.io'

Kubernetes修改apiserver的配置文件,在/etc/kubernetes/apiserver中

$ vim /etc/kubernetes/apiserver KUBE_ADMISSION_CONTROL="--admission_control=NamespaceLifecycle,NamespaceExists, LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"

去掉 ServiceAccount 选项。否则会在往后的pod创建中,会出现类似以下的错误:

Error from server: error when creating "mysql-rc.yaml": Pod "mysql" is forbidden: no API token found for service account default/default, retry after the token is automatically created and added to the service account 按顺序启动所有服务 systemctl start etcdsystemctl start dockersystemctl start kube-apiserver.servicesystemctl start kube-controller-manager.servicesystemctl start kube-scheduler.servicesystemctl start kubelet.servicesystemctl start kube-proxy.service 检验下kubernetes的服务是否跑起来 ps -ef | grep kube

到目前为止,一个单机版的Kubernetes的环境就安装启动完成了。下面我们就基于这个单机版的k8s集群来部署。

启动MySQL容器服务

我们先拉取mysql的服务镜像 :

sudo docker pull mysql或docker pull hub.c.163.com/library/mysql:latest 启动MySQL服务

首先为MySQL服务创建一个RC定义文件:mysql-rc.yaml,下面给出了该文件的完整内容

apiVersion: v1kind: ReplicationControllermetadata: name: mysqlspec: replicas: 1 selector: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: hub.c.163.com/library/mysql ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: "123456"

yaml定义文件说明:

kind:表明此资源对象的类型,例如上面表示的是一个RCspec: 对RC的相关属性定义,比如说spec.selector是RC的Pod标签(Label)选择器,既监控和管理拥有这些表情的Pod实例,确保当前集群上始终有且 仅有replicas个Pod实例在运行。spec.template定义pod的模板,这些模板会在当集群中的pod数量小于replicas时,被作为依据去创建新的Pod
创建好 mysql-rc.yaml后, 为了将它发布到Kubernetes中,我们在Master节点执行命令 $ kubectl create -f mysql-rc.yamlreplicationcontroller "mysql” created

接下来,我们用kuberctl命令查看刚刚创建的RC:

$ kubectl get rcNAME DESIRED CURRENT READY AGEmysql 1 1 0 14s

查看Pod的创建情况,可以运行下面的命令:

$ kubectl get podsNAME READY STATUS RESTARTS AGEmysql-b0gk0 0/1 ContainerCreating 0 3s

可见pod的状态处于ContainerCreating,我们需要耐心等待一下,直到状态为Running

NAME READY STATUS RESTARTS AGEmysql-b0gk0 1/1 Running 0 6m

最后,我们创建一个与之关联的Kubernetes Service - MySQL的定义文件:mysql-svc.yaml

apiVersion: v1kind: Servicemetadata: name: mysqlspec: ports: - port: 3306 selector: app: mysql

其中 metadata.name是Service的服务名,port定义服务的端口,spec.selector确定了哪些Pod的副本对应本地的服务。

运行kuberctl命令,创建service: $ kubectl create -f mysql-svc.yamlservice "mysql" created 然后我们查看service的状态 $ kubectl get svcNAME CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes 10.254.0.1 <none> 443/TCP 18mmysql 10.254.185.20 <none> 3306/TCP 14s

注意到MySQL服务被分配了一个值为 10.254.185.20的CLUSTER-IP,这是一个虚地址,随后,Kubernetes集群中的其他新创建的Pod就可以通过Service 的CLUSTER-IP+端口6379来连接和访问它了。

启动Web容器服务

先拉取一个测试镜像到本地

docker pull kubeguide/tomcat-app:v1

上面我们定义和启动了MySQL的服务,接下来我们用同样的步骤,完成Tomcat应用的服务启动过程,首先我们创建对应的RC文件 myweb-rc.yaml,具体内容如下:

apiVersion: v1kind: ReplicationControllermetadata: name: mywebspec: replicas: 5 selector: app: myweb template: metadata: labels: app: myweb spec: containers: - name: myweb image: docker.io/kubeguide/tomcat-app:v1 ports: - containerPort: 8080 env: - name: MYSQL_SERVICE_HOST value: "mysql" - name: MYSQL_SERVICE_PORT value: "3306"

与mysql一样,我们创建rc服务:

$ kubectl create -f myweb-rc.yamlreplicationcontroller "myweb" created$ kubectl get rcNAME DESIRED CURRENT READY AGEmysql 1 1 0 14mmyweb 5 5 0 10s

接着,我们看下pods的状态:

$ kubectl get podsNAME READY STATUS RESTARTS AGEmysql-b0gk0 1/1 Running 0 15mmyweb-1oyb7 1/1 Running 0 43smyweb-8ffs6 1/1 Running 0 43smyweb-xge1t 1/1 Running 0 43smyweb-xr214 1/1 Running 0 43smyweb-zia37 1/1 Running 0 43s

从上图中我们可以看到所有yaml中声明的5个副本都运行起来了。
我们创建对应的Service, 相关的myweb-svc文件如下:

apiVersion: v1kind: Servicemetadata: name: mywebspec: type: NodePort ports: - port: 8080 nodePort: 30001 selector: app: myweb

运行kubectl create 命令进行创建

$ kubectl create -f myweb-svc.yamlservice "myweb" created

最后,我们使用kubectl查看前面创建的Service

[root@kdev tmp]# kubectl get servicesNAME CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes 10.254.0.1 <none> 443/TCP 4hmysql 10.254.185.20 <none> 3306/TCP 4mmyweb 10.254.18.53 <nodes> 8080/TCP 57s 验证与总结

通过上面的几个步骤,我们可以成功实现了一个简单的K8s单机版例子,在浏览其中可以输入Linux主机地址:30001(端口)的方式来测试

$ curl http://192.168.139.149:30001<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" /> <title>Apache Tomcat/8.0.35</title> <link rel="external nofollow" rel="external nofollow" href="favicon.ico" rel="icon" type="image/x-icon" /> <link rel="external nofollow" rel="external nofollow" href="favicon.ico" rel="shortcut icon" type="image/x-icon" /> <link rel="external nofollow" href="tomcat.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="wrapper"> <div id="navigation" class="curved container"> <span id="nav-home"><a rel="external nofollow" href="http://tomcat.apache.org/">Home</a></span> <span id="nav-hosts"><a rel="external nofollow" href="/docs/">Documentation</a></span> <span id="nav-config"><a rel="external nofollow" href="/docs/config/">Configuration</a></span> <span id="nav-examples"><a rel="external nofollow" href="/examples/">Examples</a></span> <span id="nav-wiki"><a rel="external nofollow" href="http://wiki.apache.org/tomcat/FrontPage">Wiki</a></span> <span id="nav-lists"><a rel="external nofollow" href="http://tomcat.apache.org/lists.html">Mailing Lists</a></span> <span id="nav-help"><a rel="external nofollow" href="http://tomcat.apache.org/findhelp.html">Find Help</a></span> <br class="separator" /> </div> <div id="asf-box"> <h1>Apache Tomcat/8.0.35</h1> </div>.........

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。