手把手教你构建 Kubernetes 1.8 + Flannel 网络(一)

手把手教你构建 Kubernetes 1.8 + Flannel 网络(一)_第1张图片

环境说明

操作系统:CentOS7

Kubernetes版本:v1.8.4

Docker版本:v17.06-ce

Flannel 版本: flannel-v0.9.1

Ntp 服务器配置

时间同步很重要

[root@node1 ~]#  yum install ntp-server -y
[root@node1 ~]# systemctl start ntpd && systemctl enable ntpd
# yum install  ntpdate  -y                 
#重要:时间同步 (每个节点都要操作否则会有意想不到的惊喜)
# echo “*/5 * * * * /usr/sbin/ntpdate  192.168.31.221   > /dev/null 2>&1 &”  >>/etc/crontab
# /usr/sbin/ntpdate   192.168.31.221        #手动同步一次
角色 IP 组件
etcd
maser 192.168.31.221 kube-apiserver
kube-controller-manager
kube-scheduler
Flannel
kubelet
Node1 192.168.31.222 kube-proxy
docker
Flannel
kubelet
Node2 192.168.31.223 kube-proxy
kubelet
kubelet

Flannel概述

Flannel 是 CoreOS 团队针对 Kubernetes 设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker 容器都具有全集群唯一的虚拟IP地址。但在默认的Docker配置中,每个节点上的 Docker 服务会分别负责所在节点容器的 IP 分配。这样导致的一个问题是,不同节点上容器可能获得相同的内外 IP 地址。并使这些容器之间能够之间通过 IP 地址相互找到,也就是相互 ping 通。

Flannel 的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且”不重复的”IP 地址,并让属于不同节点上的容器能够直接通过内网 IP 通信。

Flannel实质上是一种“覆盖网络(overlay network)”,也就是将 TCP 数据包装在另一种网络包里面进行路由转发和通信,目前已经支持UDP、VxLAN、AWS VPC和GCE路由等数据转发方式。

一.安装docker

1.设置 yum 仓库

tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

2.执行安装

yum -y install docker-engine

3.设置开机启动

systemctl  start docker  && systemctl enable docker

4.添加 Docker Hub 国内镜像

如果没有此文件,则新建一个

vi /etc/docker/daemon.json
{
    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

5.重启 docker

systemctl  restart docker             #重启docker

6.设置 hosts 及 hostname

[root@node1 ~]#  vi /etc/hosts
192.168.31.221 node1 node1.example.com
192.168.31.222 node2 node2.example.com
192.168.31.223 node3 node3.example.com

[root@node1 ~]# hostnamectl  set-hostname   node1.example.com
[root@node2~]# hostnamectl  set-hostname   node2.example.com
[root@node3 ~]# hostnamectl  set-hostname   node3.example.com

二.给 docker 配置 Flannel 网络

1.Master 节点 etcd 配置

Etcd 安装配置 (这里做的单节点 ETCD 只在 Master 节点安装)

[root@node1 ~]#  yum install  etcd -y 
[root@node1 ~]#   vi /etc/default/etcd
ETCD_DATA_DIR="/var/lib/etcd/default"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS=http://0.0.0.0:2379
[root@node1 ~]# sed -i 's/localhost/0.0.0.0/g'  /etc/etcd/etcd.conf
[root@node1 k8s]# systemctl  start  etcd  && systemctl enable etcd
手把手教你构建 Kubernetes 1.8 + Flannel 网络(一)_第2张图片

etcd 创建 Flannel 网络

[root@node1 ~]# etcdctl --endpoints http://192.168.31.221:2379  \
set /coreos.com/network/config '{"NetWork":"10.0.0.0/16"}'

2.安装 flannel 软件并设置 docker 参数

(其他 node 节点 flannel 网络也照着这样配置)

使用软件包: flannel-v0.9.1.tar.gz (分享完会附带资料)

[root@node1 ~]# tar -zxvf  flannel-v0.9.1.tar.gz
[root@node1 ~]# cd flannel-v0.9.1
[root@node1 flannel-v0.9.1]# cp flanneld  mk-docker-opts.sh  /usr/local/bin/  
[root@node1 flannel-v0.9.1]# cd conf/
[root@node1 conf]# cp *.service  /usr/lib/systemd/system          #覆盖docker 的启动脚本
[root@node1 conf]# cp flanneld  /etc/sysconfig/
[root@node1 conf]# vi /etc/sysconfig/flanneld                    #修改 自己的etcd 服务器地址

# Flanneld configuration options
# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://192.168.31.221:2379"
# etcd config key.  This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_KEY="/coreos.com/network"
FLANNEL_OPTIONS="--etcd-endpoints=http://192.168.31.221:2379  --ip-masq=true"
# Any additional options that you want to pass
#FLANNEL_OPTIONS=""

最后重启 flannel 和 docker

systemctl daemon-reload
systemctl start flanneld   && systemctl enable flanneld 
systemctl restart docker

成功状态

ifconfig docker0 |grep  inet && ifconfig flannel0 |grep inet

三个节点 docker 网络都照这样配置

三.Kubernetes 集群配置

使用软件包:

kubernetes-v1.8.4.tar.gz

软件包分发到各个节点上

1.Master 节点配置:

[root@node1 ~]# tar -zxvf  kubernetes-v1.8.4.tar.gz
[root@node1 ~]# mkdir -p /opt/kubernetes/{bin,cfg}            #配置文件和二进制文件目录
[root@node1 ~]# cd kubernetes-v1.8.4/
[root@node1 kubernetes-v1.8.4]# tar -zxvf kubernetes-server-linux-amd64.tar.gz
[root@node1 kubernetes-v1.8.4]# cd kubernetes/server/bin/
[root@node1 bin]# cp  kube-apiserver kube-controller-manager kube-scheduler kubectl /opt/kubernetes/bin
[root@node1 bin]# cd ../../../
[root@node1 kubernetes-v1.8.4]# ./apiserver.sh 192.168.31.221 http://192.168.31.221:2379
[root@node1 kubernetes-v1.8.4]# ./scheduler.sh 192.168.31.221
[root@node1 kubernetes-v1.8.4]# ./controller-manager.sh 192.168.31.221
[root@node1 kubernetes-v1.8.4]# echo "export PATH=$PATH:/opt/kubernetes/bin" >> /etc/profile
[root@node1 kubernetes-v1.8.4]# source  /etc/profile
[root@node1 kubernetes-v1.8.4]# netstat  -tunlp           #查看服务是否启动
手把手教你构建 Kubernetes 1.8 + Flannel 网络(一)_第3张图片

2.Node1 节点上配置

[root@node2 ~]#  swapoff   -a  #禁止交换分区
[root@node2 ~]# mkdir -p /opt/kubernetes/{bin,cfg}
[root@node2 ~]# tar -zxvf  kubernetes-v1.8.4.tar.gz
[root@node2 ~]# cd kubernetes-v1.8.4
[root@node2 kubernetes-v1.8.4]# tar -zxvf kubernetes-node-linux-amd64.tar.gz 
[root@node2 kubernetes-v1.8.4]# cd kubernetes/node/bin/
[root@node2 bin]# cp kubelet kube-proxy /opt/kubernetes/bin
[root@node2 bin]# cd ../../../
[root@node2 kubernetes-v1.8.4]# ./kubelet.sh 192.168.31.221 192.168.31.222 10.10.10.2
[root@node2 kubernetes-v1.8.4]# ./proxy.sh 192.168.31.221 192.168.31.222
[root@node2 kubernetes-v1.8.4]# echo "export PATH=$PATH:/opt/kubernetes/bin" >> /etc/profile
[root@node2 kubernetes-v1.8.4]# source  /etc/profile

3.Node2 节点上配置

[root@node3 ~]#  swapoff   -a  #禁止交换分区
[root@node3 ~]# mkdir -p /opt/kubernetes/{bin,cfg}
[root@node3 ~]# tar -zxvf  kubernetes-v1.8.4.tar.gz
[root@node3 ~]# cd kubernetes-v1.8.4
[root@node3 kubernetes-v1.8.4]# tar -zxvf kubernetes-node-linux-amd64.tar.gz 
[root@node3 kubernetes-v1.8.4]# cd kubernetes/node/bin/
[root@node3 bin]# cp kubelet kube-proxy /opt/kubernetes/bin
[root@node3 bin]# cd ../../../
[root@node3 kubernetes-v1.8.4]# ./kubelet.sh 192.168.31.221 192.168.31.223 10.10.10.2
[root@node3 kubernetes-v1.8.4]# ./proxy.sh 192.168.31.221 192.168.31.223
[root@node3 kubernetes-v1.8.4]# echo "export PATH=$PATH:/opt/kubernetes/bin" >> /etc/profile
[root@node3 kubernetes-v1.8.4]# source  /etc/profile

4.查看集群状态:

[root@node1 ~]# kubectl get node

手把手教你构建 Kubernetes 1.8 + Flannel 网络(一)_第4张图片
image

5.集群管理

kubelet 在创建 pod 时会先下载一个 pause 镜像,这个镜像用于容器基础网络管理

**每个 node 节点都要执行该操作

(

镜像如果下载不下来,我们全部分享完,会把完整资料也分享给大家

)**

:

docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0   
docker tag registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0

导入镜像:

docker load -i pause-amd64.tar.gz

非常重要: 防火墙

iptables -P FORWARD ACCEPT

iptables-save

每个节点都要执行,否则通讯会有问题

测试集群网络是否正常通讯

[root@node1 ~]# cat busybox.yamlapiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - image: busybox
    command:
      - ping  
      - "114.114.114.114"
    imagePullPolicy: IfNotPresent
    name: busybox
  restartPolicy: Always
[root@node1 ~]# kubectl create -f busybox.yaml
手把手教你构建 Kubernetes 1.8 + Flannel 网络(一)_第5张图片

测试每个节点是否能 ping 通 容器 ip,能 ping 通说明正常

6.服务发现 DNS

kubedns-deployment.yaml kubedns-svc.yaml

两个文件本文档会附带(

如果dns相关镜像下载不下来,分享完会带示例

)

三个镜像导入然后再创建即可,每个节点上都要导入

kubedns-deployment.yaml
- --kube-master-url=http://192.168.31.221:8080   #改地址要改成自己的地址

[root@node1 ~]# kubectl  create -f  kubedns-svc.yaml
[root@node1 ~]# kubectl  create -f  kubedns-deployment.yaml 
[root@node1 ~]#  kubectl get pods --namespace=kube-system -l k8s-app=kube-dns
手把手教你构建 Kubernetes 1.8 + Flannel 网络(一)_第6张图片

创建 nginx 服务进行测试

[root@node1 ~]# kubectl create -f  nginx-service.yaml
[root@node1 ~]# kubectl create -f  nginx-deployment.yaml
[root@node1 ~]# kubectl  exec  busybox  -it  nslookup  nginx-service
手把手教你构建 Kubernetes 1.8 + Flannel 网络(一)_第7张图片
[root@node1 ~]# kubectl get  svc
手把手教你构建 Kubernetes 1.8 + Flannel 网络(一)_第8张图片

7.kubernetes-dashboard

节点上导入该镜像

kubernetes-dashboard.yaml  #创建darshboard实例
[root@node1 ~]# vi   kubernetes-dashboard.yaml
- --apiserver-host=http://192.168.31.221:8080      #改为自己的apiserver
[root@node1 ~]# kubectl  create -f kubernetes-dashboard.yaml
[root@node1 ~]# kubectl get pods --namespace=kube-system
手把手教你构建 Kubernetes 1.8 + Flannel 网络(一)_第9张图片
[root@node1 ~]# kubectl get svc  --namespace=kube-system
手把手教你构建 Kubernetes 1.8 + Flannel 网络(一)_第10张图片
手把手教你构建 Kubernetes 1.8 + Flannel 网络(一)_第11张图片
手把手教你构建 Kubernetes 1.8 + Flannel 网络(一)_第12张图片

推荐阅读:
手把手教你构建 Kubernetes 1.8 + Flannel 网络(二)
手把手教你构建 Kubernetes 1.8 + Flannel 网络(三)

你可能感兴趣的:(手把手教你构建 Kubernetes 1.8 + Flannel 网络(一))