×

一步步打造专属于自己的Kubernetes-1.8.4集群环境

96
胖宝宝王
2017.12.08 00:01* 字数 1124

一 kubernetes

kubernetes

以下介绍摘自Wiki
Kubernetes (通常称为K8s) 是用于自动部署、扩展和管理容器化(containerized)应用程序的开源系统。Google设计并捐赠给Cloud Native Computing Foundation(今属Linux基金会)来使用的。它旨在提供“跨主机集群的自动部署、扩展以及运行应用程序容器的平台”。它支持一系列容器工具, 包括Docker等。

本文主要介绍如何使用kubeadm快速搭建K8s集群环境,让你迅速体验学习Kubernetes。

更多内容查阅官网K8s.io


二 实验环境

硬件

宿主机:Win10 + Virtualbox
虚拟机:2核4g + 桥接网卡

主机名 系统 IP
master.k8s CentOS 7.4 x86_64 192.168.1.100
node1.k8s CentOS 7.4 x86_64 192.168.1.101
node2.k8s CentOS 7.4 x86_64 192.168.1.102

软件

软件包 版本
kubeadm v1.8.4
kubelet v1.8.4
kubectl v1.8.4
kubernetes-cni 0.5.1
docker 1.12.6

上述安装包已经上传百度云,下载链接: https://pan.baidu.com/s/1c2NJADy 密码: dfgq

镜像

Kubeadm初始化中会从gcr.io中下载很多镜像。如果是在国内(无奈的FUC~K),只得另辟蹊径,自找出路。我是将镜像同步到了Docker Hub,然后从docker hub 下载,再tag回来。

镜像名称 仓库 备注
kube-proxy-amd64:v1.8.4 gcr.io/google_containers/ FQ
kube-scheduler-amd64:v1.8.4 gcr.io/google_containers/ FQ
kube-controller-manager-amd64:v1.8.4 gcr.io/google_containers/ FQ
kube-apiserver-amd64:v1.8.4 gcr.io/google_containers/ FQ
etcd-amd64:3.0.17 gcr.io/google_containers/ FQ
k8s-dns-sidecar-amd64:1.14.5 gcr.io/google_containers/ FQ
pause-amd64:3.0 gcr.io/google_containers/ FQ
k8s-dns-kube-dns-amd64:1.14.5 gcr.io/google_containers/ FQ
k8s-dns-dnsmasq-nanny-amd64:1.14.5 gcr.io/google_containers/ FQ
flannel:v0.9.1-amd64 quay.io/coreos 正常访问

三 all节点

下列操作在所有节点以root用户执行。

3.1 更新系统

yum makecache fast
yum -y update

3.2 停用SWAP分区

临时停止,重启无效:
# swapoff -a

永久关闭:

1. 删除SWAP分区
2. 修改/etc/default/grub,找到GRUB_CMDLINE_LINUX并删除swap
3. 备份/etc/grub2.cfg
4. 重新生成/etc/grub2.cfg

3.3 关闭SELinux

临时停止,重启无效:
# setenforce 0

永久关闭:
修改/etc/selinux/config,然后重启系统。

3.4 设置内核参数

cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

3.5 安装kubeadm等包

将下载好的包上传至系统目录,这里是/opt/soft/

执行安装命令:yum localinstall -y /opt/soft/*.rpm

3.6 开启firewalld

systemctl restart firewalld
systemctl enable firewalld

3.7 加速docker pull

由于大部分源都在国外,国内下载体验很不好,所以需要设置docker加速器。

常用的有:

  1. Daocloud 加速
  2. aliyun 加速

这里使用Daocloud

3.8 调整kubelet启动参数

这一步很关键,在没有调整kubelet启动参数之前,我初始化K8s cluster后,在 /var/log/message 中频繁出现以下错误信息:

Nov 28 09:29:03 k8s kubelet: E1128 09:29:03.679613    6485 summary.go:92] Failed to get system container stats for "/system.slice/kubelet.service": failed to get cgroup stats for "/system.slice/kubelet.service": failed to get container info for "/system.slice/kubelet.service": unknown container "/system.slice/kubelet.service"
Nov 28 09:29:03 k8s kubelet: E1128 09:29:03.679651    6485 summary.go:92] Failed to get system container stats for "/system.slice/docker.service": failed to get cgroup stats for "/system.slice/docker.service": failed to get container info for "/system.slice/docker.service": unknown container "/system.slice/docker.service"
Nov 28 09:29:03 k8s kubelet: W1128 09:29:03.679695    6485 helpers.go:847] eviction manager: no observation found for eviction signal allocatableNodeFs.available

后来在 stackoverflow 上找到了同问题的解决办法,就是调整启动参数:

编辑配置文件 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

新增: Environment="KUBELET_MY_ARGS=--runtime-cgroups=/systemd/system.slice --kubelet-cgroups=/systemd/system.slice"

修改ExecStart: 在末尾新增 $KUBELET_MY_ARGS

问题地址: https://stackoverflow.com/questions/46726216/kubelet-fails-to-get-cgroup-stats-for-docker-and-kubelet-services

3.9 下载镜像

从docker hub中下载所需镜像,并重新tag

images=(kube-proxy-amd64:v1.8.4 kube-scheduler-amd64:v1.8.4 kube-controller-manager-amd64:v1.8.4 kube-apiserver-amd64:v1.8.4 etcd-amd64:3.0.17 k8s-dns-sidecar-amd64:1.14.5 pause-amd64:3.0 k8s-dns-kube-dns-amd64:1.14.5 k8s-dns-dnsmasq-nanny-amd64:1.14.5) 

for imageName in ${images[@]} ; do
  docker pull yotoobo/$imageName
  docker tag  yotoobo/$imageName gcr.io/google_containers/$imageName
  docker rmi  yotoobo/$imageName
done

3.10 修改/etc/hosts

由于没有内网dns服务,所以这里使用hosts文件。

添加以下内容到/etc/hosts

192.168.1.100 master.k8s
192.168.1.101 node1.k8s
192.168.1.102 node2.k8s

四 master节点

下列操作在master节点以root用户执行。

4.1 允许指定端口访问

firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10251/tcp
firewall-cmd --permanent --add-port=10252/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --reload

端口作用:

端口 目的
6443 kube-apiserver
2379-2380 etcd server client API
10250 kubelet api
10251 kube-scheduler
10252 kube-controller-manager
10255 Read-only Kubelet API

4.2 启动服务

systemctl enable kubelet && systemctl restart kubelet
systemctl enable docker && systemctl restart docker

4.3 kubeadm 初始化

kubeadm init --kubernetes-version=v1.8.4 --token-ttl 0 --pod-network-cidr=10.244.0.0/16

--kubernetes-version=v1.8.4 :不指定会去google获取版本信息,所以你懂的~~~
--token-ttl 0 :token永不过期,不指定默认24h后过期
--pod-network-cidr=10.244.0.0/16 :如果要正常使用Flannel,则确保使用此配置

接着等待初始化完成

kubeadm-init

如果看到提示1,则说明初始化成功,恭喜,你已经成功了90%了。

按照提示2执行对应操作。

提示3则非常重要了,要妥善保存好,以后添加node机到K8s集群就需要它了。

4.4 安装Flannel

K8s有许多可选的Pod Network,这里选择Coreos的Flannel

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

4.5 查看master状态

get-info

五 nodes节点

下列操作在nodes节点以root用户执行。

5.1 允许指定端口

firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --reload

30000-32767为NodeService的默认端口

5.2 启动服务

systemctl enable kubelet && systemctl restart kubelet
systemctl enable docker && systemctl restart docker

5.3 kubeadm join

使用步骤4.3中的提示3,将nodes节点添加到K8s集群中。

kubeadm-join

最后

至此,我们借助Kubeadm搭建了一套3节点的集群环境,不过需要指出的是Kubeadm还是一个beta版工具,还不建议在生产环境中使用。因为master节点、etcd、kube-apiserver等都还属于单节点。

现在,回到master机器上,再来验证下K8s环境:

get-info2

在创建一个简单的Pod:

cat >> /opt/k8s/myapp-pod.yml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox
    command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
EOF

kubectl apply -f /opt/k8s/myapp-pod.yml

验证:

pod-info

K8s还有许许多多的特性和功能,在深入学习中你会发现K8s是如此的强大而富有魅力。

奔跑的K8s!!!

同时此文章也发布在了我的个人博客,希望大家可以多多光顾。

Docker
Web note ad 1