一 开篇
上一篇文章我讲解了etcd 集群的部署,经过研读 docker 与 k8s 的官方网站,现在就开始做 Kubenetes 集群的搭建。
二 目标
1)搭建 1 主 2 从的 k8s 集群
2)k8s 集群利用外部的 etcd 集群作为数据存储与服务发现
搭建集群,就要基于实际的业务情况判断集群规模以及可用性,1 主 2 从适用于小规模集群,主节点主要用于调度以及下发配置等,且数据中心依赖于外部 etcd 的集群,有一定的可用性,如果集群规模较大且容器容纳的微服务较多,请考虑多主多从的高可用方案
3)k8s 集群使用 flannel 作为 pod network
kubenetes 提供了 Calico、Canal、Cilium、Flannel、Kube-router、Romana、JuniperContrail/TungstenFabric 这些方案,Flannel 虽然不是这些方案中性能最优的,但它是适用场景最多的,各自的优缺点请大家自行 google,这里不做过多的介绍
4)kube-proxy 使用 ipvs 模式
为什么用 ipvs 模式,而不用 iptables,官方描述的不同点如下,本人在此不做翻译,不同之处没说太多,ipvs 的优点倒是通篇体现,有一种谁用谁知道的感觉再此,so...
1. IPVS provides better scalability and performance for large clusters.
2. IPVS supports more sophisticated load balancing algorithms than iptables (least load, least connections, locality, weighted, etc.).
3. IPVS supports server health checking and connection retries, etc.
kubenetes 基于 ipvs 的链接菌再此,有兴趣的请看点我
三 环境介绍
三台云主机,系统环境均为 Centos7,3 点节点已部署好 etcd 集群,本文 etcd 集群跟 k8s 集群在相同的节点上,实际的生产环境中建议大家另行找 3 台 2 核 8g 内存的云主机部署 etcd 集群,名称及 IP 地址如下:
app1:192.168.16.5
app2:192.168.16.6
app3:192.168.16.102
四 集群部署
4.1 部署社区版 docker(全部节点执行)
4.1.1 卸载历史版本
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
4.1.2 安装必须依赖包
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
4.1.3 添加安装包的仓库
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
4.1.4 查看可安装的版本
yum list docker-ce --showduplicates | sort -r
4.1.5 这里安装的是 docker-ce-18.03.0.ce 版本的 docker,如果不选择版本,默认安装最新版本的
sudo yum install docker-ce-18.03.0.ce
4.1.6 启动 docker 服务
sudo systemctl start docker
4.2 部署 k8s(全部节点执行)
4.2.1 添加 k8s 的仓库
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF
※如若不能翻墙的话,请把 google 的镜像改为阿里云的,没标出的部分不修改
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
4.2.2 关闭 selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
4.2.3 设置 iptables&生效
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
4.2.4 安装&启动服务
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet && systemctl start kubelet
4.3 加载 ipvs 模块
4.3.1 确认是否开启
cut -f1 -d " " /proc/modules | grep -e ip_vs -e nf_conntrack_ipv4
4.3.2 开启 ipvs 模块
如果 4.3.1 的结果不包括以下几项:
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
请执行以下操作后再执行 4.3.1 进行确认
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
4.3.3 ipvs 模块无法开启的情况请确认内核是否满足 k8s 的最低版本需求。版本等需求点这里
4.4 利用 kubeadm 配置集群
4.4.1 设备 docker 的翻墙代理(全节点执行,配置集群的所需镜像需翻墙才能下载,如不能翻墙请自行把镜像下载的各自节点的仓库中去)
mkdir -p /etc/systemd/system/docker.service.d
cat <<EOF > /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://ip:port/"
EOF
4.4.2 书写初期化文件 init.yaml
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: v1.13.1
#使用外部etcd集群,如果不使用则在master节点启动一个etcd的pod作为数据中心
etcd:
external:
endpoints:
- http://192.168.16.5:2379
- http://192.168.16.6:2379
- http://192.168.16.102:2379
#设置flannel网络
networking:
podSubnet: 10.244.0.0/16
---
#设置kube-proxy的模式为ipvs,默认iptables
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
4.4.3 创建 master,本文以 app1 作为 master,当前系统用户为非 root 用户
sudo kubeadm init --config init.yaml
4.4.4 设置当前用户可以使用集群
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.4.5 启用 flannel 网络
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml
4.4.6 加入 worker 节点
app2 跟 app3 节点分别执行,token,ip,port,hash 等信息从 mater 初期化好的日志中寻找,如果找不到请参照这里
kubeadm join --token : --discovery-token-ca-cert-hash sha256:
五 集群确认
5.1 确认节点信息
kubectl get nodes
NAME STATUS ROLES AGE VERSION
app1 Ready master 4h49m v1.13.1
app2 Ready <none> 4h43m v1.13.1
app3 Ready <none> 4h43m v1.13.1
5.2 确认 flannel 网络
kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-86c58d9df4-b475b 1/1 Running 0 4h50m
coredns-86c58d9df4-kxlwk 1/1 Running 0 4h50m
kube-apiserver-app1 1/1 Running 0 4h50m
kube-controller-manager-app1 1/1 Running 0 4h49m
kube-flannel-ds-amd64-6hw7r 1/1 Running 0 4h45m
kube-flannel-ds-amd64-mqczn 1/1 Running 0 4h44m
kube-flannel-ds-amd64-zsp9n 1/1 Running 0 4h50m
kube-proxy-8krlq 1/1 Running 0 4h50m
kube-proxy-cnwfx 1/1 Running 0 4h44m
kube-proxy-vdfw9 1/1 Running 0 4h45m
kube-scheduler-app1 1/1 Running 0 4h50m
5.3 确认 kube-proxy 为 ipvs 模式(日志包含 server_others.go:189] Using ipvs Proxier.的字样即可)
kubectl logs kube-proxy-8krlq -n kube-system
I0108 12:27:37.199116 1 server_others.go:189] Using ipvs Proxier.
W0108 12:27:37.199434 1 proxier.go:365] IPVS scheduler not specified, use rr by default
I0108 12:27:37.199576 1 server_others.go:216] Tearing down inactive rules.
I0108 12:27:37.245958 1 server.go:464] Version: v1.13.1
I0108 12:27:37.255926 1 conntrack.go:52] Setting nf_conntrack_max to 262144
I0108 12:27:37.256226 1 config.go:202] Starting service config controller
I0108 12:27:37.256277 1 controller_utils.go:1027] Waiting for caches to sync for service config controller
I0108 12:27:37.256347 1 config.go:102] Starting endpoints config controller
I0108 12:27:37.256373 1 controller_utils.go:1027] Waiting for caches to sync for endpoints config controller
I0108 12:27:37.356479 1 controller_utils.go:1034] Caches are synced for service config controller
I0108 12:27:37.356502 1 controller_utils.go:1034] Caches are synced for endpoints config controller
六 参考文档
6.1 docker 官方文档
6.2 k8s 官方文档
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于