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

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

环境准备

本文的例子是基于Centos 7的Linux版本,大家也可以使用ubuntu或其他发行版,软件搭建的方式基本是差不多的,为了让例子更简单, 本文省去了网络Fannel的安装与配置,只做基本通用的开发环境搭建,希望对大家有帮助。

本例子用于测试的服务器ip为:172.16.21.35

yum源

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


关闭防火墙服务

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
安全设置
setenforce 0 查看iptables
systemctl status iptables.service
systemctl stop iptables.service 设置主机名
hostnamectl –static set-hostname centos-master 关闭Selinux
/etc/selinux/config
SELINUX=disabled

  

安装etcd和Kubernetes软件(docker会在安装kubernetes的过程中被安装)

$ yum install -y etcd kubernetes

配置修改

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

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

$ vim /etc/sysconfig/docker

OPTIONS='--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

切换docker hub 镜像源

在国内为了稳定pull镜像,我们最好使用Daocloud的镜像服务 :)

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://dbe35452.m.daocloud.io

  

按顺序启动所有服务

systemctl start etcd
systemctl start docker
systemctl start kube-apiserver.service
systemctl start kube-controller-manager.service
systemctl start kube-scheduler.service
systemctl start kubelet.service
systemctl start kube-proxy.service

  

然后,我们检验下kubernetes的服务是否跑起来

ps -ef | grep kube

  

到目前为止,一个单机版的Kubernetes的环境就安装启动完成了。接下来,我就基于这个单机版,撸起袖子,认真干!!!

启动MySQL容器服务

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

sudo docker pull mysql

docker pull hub.c.163.com/library/mysql:latest

  

启动MySQL服务

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

cat >mysql-rc.yaml<<-EOF
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql
spec:
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"
EOF

  

yaml定义文件说明:

  • kind:表明此资源对象的类型,例如上面表示的是一个RC
  • spec: 对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.yaml
replicationcontroller "mysql” created

  

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

$ kubectl get rc

NAME      DESIRED   CURRENT   READY     AGE
mysql 1 1 0 14s

  

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

$ kubectl get pods

NAME          READY     STATUS              RESTARTS   AGE
mysql-b0gk0 0/1 ContainerCreating 0 3s

  

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

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

  

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

cat >mysql-svc.yaml<<-EOF
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
EOF

  

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

运行kuberctl命令,创建service:

$ kubectl create -f mysql-svc.yaml

service "mysql" created

  

然后我们查看service的状态

$ kubectl get svc

NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes 10.254.0.1 <none> 443/TCP 18m
mysql 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,具体内容如下:

cat >myweb-rc.yaml<<-EOF
apiVersion: v1
kind: ReplicationController
metadata:
name: myweb
spec:
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"
EOF

  

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

$ kubectl create -f myweb-rc.yaml
replicationcontroller "myweb" created $ kubectl get rc
NAME DESIRED CURRENT READY AGE
mysql 1 1 0 14m
myweb 5 5 0 10s

  

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

$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-b0gk0 1/1 Running 0 15m
myweb-1oyb7 1/1 Running 0 43s
myweb-8ffs6 1/1 Running 0 43s
myweb-xge1t 1/1 Running 0 43s
myweb-xr214 1/1 Running 0 43s
myweb-zia37 1/1 Running 0 43s

  

wow..从命理结果我们发现,我们yaml中声明的5个副本都被创建并运行起来了,我们隐约感受到k8s的威力咯

我们创建对应的Service, 相关的myweb-svc文件如下:

cat >myweb-svc<<-EOF
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30001
selector:
app: myweb
EOF

  

运行kubectl create 命令进行创建

$ kubectl create  -f myweb-svc.yaml
service "myweb" created

  

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

[root@kdev tmp]# kubectl get services
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 4h
mysql 10.254.185.20 <none> 3306/TCP 4m
myweb 10.254.18.53 <nodes> 8080/TCP 57s

  

验证

通过上面的几个步骤,我们可以成功实现了一个简单的K8s单机版例子,我们可以在浏览器输入 http://172.16.21.35:30001/demo/ 来测试我们发布的web应用。

$ curl http://172.16.21.31:30001
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> ... ... ...

  

接下来就是安装kubernetes-dashboard ,下载kubernetes-dashboard.yaml文件,修改一下即可;

cat >kubernetes-dashboard.yaml<<-EOF
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
labels:
app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
app: kubernetes-dashboard
template:
metadata:
labels:
app: kubernetes-dashboard
# Comment the following annotation if Dashboard must not be deployed on master
annotations:
scheduler.alpha.kubernetes.io/tolerations: |
[
{
"key": "dedicated",
"operator": "Equal",
"value": "master",
"effect": "NoSchedule"
}
]
spec:
containers:
- name: kubernetes-dashboard
image: docker.io/mritd/kubernetes-dashboard-amd64 #默认的镜像是使用google的,这里改成内网
imagePullPolicy: Always
ports:
- containerPort: 9090
protocol: TCP
args:
# Uncomment the following line to manually specify Kubernetes API server Host
# If not specified, Dashboard will attempt to auto discover the API server and connect
# to it. Uncomment only if the default does not work.
- --apiserver-host=http://172.16.21.35:8080 #注意这里是api的地址
livenessProbe:
httpGet:
path: /
port: 9090
initialDelaySeconds: 30
timeoutSeconds: 30
---
kind: Service
apiVersion: v1
metadata:
labels:
app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
type: NodePort
ports:
- port: 80
targetPort: 9090
selector:
app: kubernetes-dashboard EOF

  

# kubectl create -f kubernetes-dashboard.yaml 

# kubectl get pods --all-namespaces  

NAMESPACE     NAME                                    READY     STATUS    RESTARTS   AGE 

default       nginx-controller-6n19x                  1/1       Running   0          9m 

kube-system   kubernetes-dashboard-2079301569-0qzdv   1/1       Running   0          12m

  

centOS下单点部署k8s的更多相关文章

  1. CentOS下 Django部署 nginx+uWSGI+Django(二)

    该篇内容承接CentOS下 Django部署 uWSGI+Django(一),细节流程可参考此篇内容. 1. 当前系统 CentOS Linux release 7.6.1810 Python 2.7 ...

  2. 解决阿里云ECS下kubeadm部署k8s无法指定公网IP

    背景 一般情况下,"kubeadm"部署集群时指定"--apiserver-advertise-address=<public_ip>"参数,即可在 ...

  3. CentOS 下搭建部署独立SVN服务器全程详解(5.5)

    SVN服务器有2种运行方式: 1.独立服务器(例如:svn://xxx.com/xxx): 2.借助apache   (例如:http://svn.xxx.com/xxx): 为了不依赖apache, ...

  4. CentOS下 Django部署 uWSGI+Django(一)

    由于新冠疫情的缘故,公司要求员工停薪休假,赋闲在家的时候还是决定做点正事,学学习. 本人Linux入门水平,Python入门水平,所以在网上找的那些python部署的帖子,看的是云里雾里的,也没有达到 ...

  5. 在Centos下单机部署kubernetes

    官方安装手册 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ ...

  6. azkaban在centos下的部署安装

    azkaban 是一个用Java开发的开源调度工具workflow. 下面介绍具体安装过程,我这里使用的版本是3.43.0,使用的是solo运行模式. 编译 git clone https://git ...

  7. Linux/Centos下安装部署phantomjs 及使用

    PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, ...

  8. Centos下zabbix部署(二)agent安装并设置监控

    1.配置zabbix源 rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch ...

  9. CentOS下Nginx部署React静态应用

    查看CentOS版本: cat /etc/redhat-release 安装nginx: yum install nginx 查看nginx版本: nginx -v 启动nginx: systemct ...

随机推荐

  1. java performance tools / NetBeans Profiler / Sun BTrace / Eclipse MAT / IBM ISA

    s Oracel Performace Analyzer NetBeans Profiler Eclipse MAT Sun BTrace IBM ISA end

  2. 面向对象【day08】:反射的最佳实践(三)

    本节内容 1.伪造web框架的路由系统 2.反射函数 3.扩展导入模块 4.企业最佳实践 一.伪造web框架的路由系统 commons.py #!/usr/bin/env python # -*- c ...

  3. 学习windows编程 day6 之处理鼠标移动

    #define POINT_MAX 1000 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPara ...

  4. contourf和contour用法区别

    import numpy as np import matplotlib.pyplot as plt %matplotlib inline from matplotlib.colors import ...

  5. SpringMVC学习笔记_02

    1.springmvc对多视图的支持 (1)导入xml格式视图支持的jar包   注意:springmvc本身就支持xml格式,所以不用导入其他支持的jar包了. (2)在springmvc.xml中 ...

  6. AVL树的JAVA实现及AVL树的旋转算法

    1,AVL树又称平衡二叉树,它首先是一颗二叉查找树,但在二叉查找树中,某个结点的左右子树高度之差的绝对值可能会超过1,称之为不平衡.而在平衡二叉树中,任何结点的左右子树高度之差的绝对值会小于等于 1. ...

  7. 用Emacs的这些年

    读技术博客时发现又有人提起我曾写的那篇口水文章 为何Emacs和Vim被称为两大神器.写那篇文章时,我还在Vim和Emacs之间摇摆.当然主要在用vim,博士学位论文和所有的国际会议文章都是用Vim编 ...

  8. div背景透明内容不透明与0.5PX边框兼容设置

    1.问题:设置 border-width:0.5px;  并兼容安卓和苹果移动端.  兼容:苹果IOS的 safari 支持浮点数边框,安卓浏览器不支持,会四舍五入到1px.不同浏览器效果额不同  解 ...

  9. POJ3694 Network【连通分量+LCA】

    题意: 一个无向图可以有重边,下面q个操作,每次在两个点间连接一条有向边,每次连接后整个无向图还剩下多少桥(注意是要考虑之前连了的边,每次回答是在上一次的基础之上). 思路: 首先运行一次Tarjan ...

  10. [JXOI2018]游戏 (线性筛,数论)

    [JXOI2018]游戏 \(solution:\) 这一道题的原版题面实在太负能量了,所以用了修改版题面. 这道题只要仔细读题,我们就可以将题目的一些基本性质分析出来:首先我们定义:对于某一类都可以 ...