最近在学习Kubernetes,在学习过程中也踩了很多的坑,网上找了很多的资料和博客按步骤搭建总会有踩很多的坑,所有自已也将学习过程记录下了,供指点学习
kubernetes(k8s)是docker容器用来编排和管理的工具
我们通过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
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
服务器主机名称 | 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
在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
yum install -y etcd
安装完后,修改etcd的配置,配置文件路径:/etc/etcd/etcd.conf,执行以下命令:vim /etc/etcd/etcd.conf
修改成以下:参数说明:
- 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
对应
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]#
vim apiserver

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
中的SecurityContextDeny
和ServiceAccount
去掉,这是权限相关的4.配置全局配置文件config
修改 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
也可以在访问http://10.11.3.56:8080地址
六 ,node-1服务器上安装服务组件
1. 安装配置flannel
yum install -y flannel
安装完后修改相应配置,如下:
2.安装配置kubernetes-node
2.1 安装 kubernetes-node
yum install -y kubernetes-node
安装完后修相应配置2.2 修改全局配置文件,如下:
修改 KUBE_MASTER="--master=http://master:8080"
2.3 配置kubelet组件
修改
- # 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"
关于:
- 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
若正常工作,可获取工作节点信息及运行状态为Ready,
七,发布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
- docker pull nginx
- docker pull <span style="color:rgb(79,79,79);font-size:14px;text-align:justify;">docker.io/kubernetes/pause</span>
kubectl delete pod nginx-pod.yaml
kubectl create -f nginx-pod.yaml

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 状态,如下图:
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状态 ,如下图:
7.5 测试nginx服务
也可以访问node-1 地址 http://10.11.3.61:30001
参考链接:
http://blog.youkuaiyun.com/u013760355/article/details/68061976
http://bbotte.com/kvm-xen/let-kubernetes-k8s-run-in-docker/
https://blog.youkuaiyun.com/harris135/article/details/79082008