最近在学习Kubernetes,在学习过程中也踩了很多的坑,网上找了很多的资料和博客按步骤搭建总会有踩很多的坑,所有自已也将学习过程记录下了,供指点学习

kubernetes(k8s)是docker容器用来编排和管理的工具

kubespere一键安装 安装kubernetes_kubernetes

我们通过kubectl向k8s Master发出指令。kubernetes Master主要是提供API Server、Scheduler、Controller组件,接收kubectl的命令,从Node节点获取Node的资源信息,并发出调度任务。Node节点提供kubelet、kube-proxy,每个node节点都安装docker,是实际的执行者。kubernetes不负责网络,所以一般是用flannel或者weave。etcd负责服务发现和node信息存储,下面开始:

一,系统环境和组件版本说明

1. 我现在用的虚拟机版本为 12.5.5 ,Workstation 12 Pro

 

kubespere一键安装 安装kubernetes_nginx_02

2. centos,docker,kubernetes,etcd,flannel版本如下:

[root@master cloud]# cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core) 
[root@master cloud]# docker --version
Docker version 1.12.6, build ec8512b/1.12.6
[root@master cloud]# kubectl --version
Kubernetes v1.5.2
[root@master cloud]# etcdctl --version
etcdctl version: 3.2.9
API version: 2
[root@node-1 kubernetes]# flanneld -version
0.7.1

二,虚拟机master,node 分配情况

服务器主机名称    

IP           

服务组件                                                                                                               

master

10.11.3.56     

docker,apiserver, controller-manager, scheduler                       

etcd

10.11.3.56     

etcd                                                                   

node-1

10.11.3.61     

flannel, docker, kubelet, kube-proxy                      

这里将 etcd master放在一台虚机上

三,基本环境配置

1. 关闭防火墙

在master,node-1 虚机上分另都关闭防火墙,执行以下命令


systemctl disable firewalld.service #使开机不启动防火墙(永久关闭)
systemctl stop firewalld.service # 关闭防火墙

2.添加hosts

在master和node-1中分别添加以下内容:


[root@master cloud]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6


10.11.3.56  master
10.11.3.56  etcd
10.11.3.61  node-1

四,安装服务组件

1.在master,node-1上分别安装docker,执行以下命令:


yum install -y docker

安装完后,启动docker,并设置开机启动,执行以下命令:


systemctl enable docker.service
systemctl start docker.service

2.在etcd虚机上安装etcd组件

yum install -y etcd

安装完后,修改etcd的配置,配置文件路径:/etc/etcd/etcd.conf,执行以下命令:


vim /etc/etcd/etcd.conf

修改成以下:

kubespere一键安装 安装kubernetes_nginx_03

参数说明:

name      节点名称
data-dir      指定节点的数据存储目录
listen-peer-urls      监听URL,用于与其他节点通讯
listen-client-urls    对外提供服务的地址:比如 http://ip:2379,http://127.0.0.1:2379 ,客户端会连接到这里和 etcd 交互
initial-advertise-peer-urls   该节点同伴监听地址,这个值会告诉集群中其他节点
initial-cluster   集群中所有节点的信息,格式为 node1=http://ip1:2380,node2=http://ip2:2380,… 。注意:这里的 node1 是节点的 --name 指定的名字;后面的 ip1:2380 是 --initial-advertise-peer-urls 指定的值
initial-cluster-state     新建集群的时候,这个值为 new ;假如已经存在的集群,这个值为 existing
initial-cluster-token     创建集群的 token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误
advertise-client-urls     对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点

主要修改ETCD_LISTEN_CLIENT_URLS,ETCD_ADVERTISE_CLIENT_URLS这两项,设置开机启动和启动etcd:

systemctl enable etcd.service
systemctl start etcd.service

配置etcd内网信息

etcdctl -C 10.11.3.56:2379 set /atomic.io/network/config '{"Network":"172.17.0.0/16"}' 

PS:其中网络号172.17.0.0/16与docker中的docker0网络一致(若不一致,可修改docker0网络或者配置上述etcd网络);atomic.io与下面的Flannel配置中的FLANNEL_ETCD_PREFIX对应五,master服务器上安装服务组件

1. 安装kubernetes-master

yum install -y kubernetes-master

2.安装完后,设置相关配置,切换目录 cd /etc/kubernetes下:

[root@master cloud]# cd /etc/kubernetes/
[root@master kubernetes]# ll
total 16
-rw-r--r--. 1 root root 868 Jan 16 10:24 apiserver
-rw-r--r--. 1 root root 652 Jan 16 10:25 config
-rw-r--r--. 1 root root 189 Jul  3  2017 controller-manager
-rw-r--r--. 1 root root 111 Jul  3  2017 scheduler
[root@master kubernetes]#

3.配置apiserver

vim apiserver


kubespere一键安装 安装kubernetes_docker_04

主要修改以下项内容:

 

KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" 

KUBE_ETCD_SERVERS="--etcd-servers=http://etcd:2379" 

KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota" 

PS:测试时需要把KUBE_ADMISSION_CONTROL中的SecurityContextDenyServiceAccount去掉,这是权限相关的



4.配置全局配置文件config

kubespere一键安装 安装kubernetes_nginx_05


修改 KUBE_MASTER="--master=http://master:8080" 

5.设置kubernetes-master服务开机启动并启动相应服务


systemctl enable kube-apiserver kube-scheduler kube-controller-manager
systemctl start kube-apiserver kube-scheduler kube-controller-manager

6.测试kubernetes-master服务

kubespere一键安装 安装kubernetes_nginx_06

也可以在访问http://10.11.3.56:8080地址

kubespere一键安装 安装kubernetes_docker_07

六 ,node-1服务器上安装服务组件

1. 安装配置flannel


yum install -y flannel

安装完后修改相应配置,如下:

kubespere一键安装 安装kubernetes_nginx_08


2.安装配置kubernetes-node

 2.1 安装 kubernetes-node 

yum install -y kubernetes-node

安装完后修相应配置

2.2 修改全局配置文件,如下:

kubespere一键安装 安装kubernetes_nginx_09

修改 KUBE_MASTER="--master=http://master:8080"

2.3 配置kubelet组件

kubespere一键安装 安装kubernetes_k8s_10

修改


# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=node-1"
# location of the api-server
KUBELET_API_SERVER="--api-servers=http://master:8080"



关于:


# pod infrastructure container
#KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=docker.io/kubernetes/pause"



这一项修改主要是因为我所在的网络环境无法访问grc.io,所以 registry.access.redhat.com/rhel7/pod-infrastructure:latest这个镜像下载不了,里面是设置的一个基础镜像,我是在master服务器上手动下载一个docker.io/kubernetes/pause镜像,后文有说明

2.4 设置kubernetes-node服务组件开机启动,并启动组件

systemctl enable kubelet kube-proxy
systemctl start kubelet kube-proxy

2.5 测试集群是否正常工作

若正常工作,可获取工作节点信息及运行状态为Ready,

kubespere一键安装 安装kubernetes_k8s_11

七,发布nginx服务

7.1 创建pod

创建nginx-pod.yaml文件,并下编辑输入以下内容:


apiVersion: v1
kind: Pod
metadata:
 name: nginx-pod
 labels:
  name: nginx-pod
spec:
 containers:
 - name: nginx
   image: nginx
   ports:
   - containerPort: 80

在创建文件的当前目录执行以下命令:


kubectl create -f nginx-pod.yaml

7.2查看pod状态


kubectl get pods

查看 pod状态会发现,


NAME READY STATUS RESTARTS AGE 
nginx-pod 0/1 ContainerCreating 0 40s

这是因为 网络问题失败或在pull镜像正在下载中,我这里是先在master服务器上手动下载的,

docker pull nginx
docker pull docker.io/kubernetes/pause

然后先删除pod,再创建

kubectl delete pod nginx-pod.yaml
kubectl create -f nginx-pod.yaml


kubespere一键安装 安装kubernetes_nginx_12



7.3 创建replicationController 

创建文件nginx-rc.yaml并编辑输入以下内容

apiVersion: v1
kind: ReplicationController
metadata:
 name: nginx-rc
spec:
 replicas: 1
 selector:
  name: nginx-pod
 template:
  metadata:
   labels:
    name: nginx-pod
  spec:
   containers:
   - name: nginx-pod
     image: nginx
     ports:
     - containerPort: 80

执行以下命令:


kubectl create -f nginx-rc.yaml

查看replicationController 状态,如下图:

kubespere一键安装 安装kubernetes_nginx_13

7.4 创建service

创建nginx-service.yaml 文件,并编辑输入以下内容:


apiVersion: v1
kind: Service
metadata:
 name: nginx-service
spec:
 type: NodePort
 ports:
 - port: 80
   nodePort: 30001
 selector:
  name: nginx-pod

执行以下命令:


kubectl create -f nginx-service.yaml

查看service状态 ,如下图:

kubespere一键安装 安装kubernetes_docker_14



7.5 测试nginx服务 

kubespere一键安装 安装kubernetes_kubespere一键安装_15


也可以访问node-1 地址 http://10.11.3.61:30001

kubespere一键安装 安装kubernetes_nginx_16


参考链接:

http://bbotte.com/kvm-xen/let-kubernetes-k8s-run-in-docker/