最近在学习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
二,虚拟机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
修改成以下:
参数说明:
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
主要修改以下项内容:
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
6.测试kubernetes-master服务
也可以在访问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"
关于:
# 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,
七,发布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
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
参考链接: