安装环境
不支持centos8的系统
ip | 服务 | 硬件要求 |
---|---|---|
192.168.1.11(node1) | Docker(已安装)、kubernetes | 内存4G,双核CPU |
192.168.1.12(node2) | Docker(已安装)、kubernetes | 内存4G,双核CPU |
192.168.1.13(node3) | Docker(已安装)、kubernetes | 内存4G,双核CPU |
安装步骤
环境准备
为了修改文件传输文件的方便,将主机名更改为安装环境所述的node,并写入hosts文件
ssh设置
node1
[root@localhost ~]# vim /etc/hosts
192.168.1.11 node1
192.168.1.12 node2
192.168.1.13 node3
ssh免密
方便传输文件
node1
[root@localhost ~]# ssh-keygen
[root@localhost ~]# ssh-copy-id -i root@node2
[root@localhost ~]# ssh-copy-id -i root@node3
传输hosts文件
[root@localhost ~]# scp /etc/hosts root@node2:/etc
[root@localhost ~]# scp /etc/hosts root@node3:/etc
更改主机名
node1
[root@localhost ~]# hostname node1
[root@localhost ~]# bash
[root@node1 ~]#
node2
[root@localhost ~]# hostname node2
[root@localhost ~]# bash
[root@node2 ~]#
node3
[root@localhost ~]# hostname node3
[root@localhost ~]# bash
[root@node3 ~]#
关闭防火墙沙盒
node1/2/3
systemctl stop firewalld
setenforce 0
vim /etc/selinux/config
# 修改
SELINUX=disabled
kubernetes安装环境要求
防火墙端口
如果不关闭防火墙,请放下以下端口
Master节点
协议 | 方向 | 端口范围 | 目的 | 使用者 |
---|---|---|---|---|
TCP协议 | 入站 | 64430-64439 | Kubernetes API server | 所有 |
TCP协议 | 入站 | 2379-2380 | etcd server client API | kube-apiserver, etcd |
TCP协议 | 入站 | 10250 | Kubelet API | Self, Control plane |
TCP协议 | 入站 | 10251 | kube-scheduler | Self |
TCP协议 | 入站 | 10252 | kube-controller-manager | Self |
Node节点
协议 | 方向 | 端口范围 | 目的 | 使用者 |
---|---|---|---|---|
TCP协议 | 入站 | 10250 | Kubelet API | Self, Control plane |
TCP协议 | 入站 | 30000-32767 | NodePort Services† | 所有 |
验证每个节点的mac地址和product_uuid是唯一的
kubernetes通过这两个值来确定集群中的节点
node1
[root@node1 ~]# cat /sys/class/dmi/id/product_uuid
E2B74D56-23A9-4E8B-620C-555387355616
node2
[root@node2 ~]# cat /sys/class/dmi/id/product_uuid
371E4D56-E8D8-294C-DA42-D06C62FD9B62
node3
[root@node3 ~]# cat /sys/class/dmi/id/product_uuid
96E94D56-D4D8-18DC-FDAE-89060C320C7A
iptables桥接流量
因为增加内存的原因,需要关机,所以服务需要重启
systemctl start docker
systemctl enable docker
node1
关于iptables的两项配置依赖于docker,docker服务必须启动
[root@node1 ~]# vim /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0 # 当内存oom时不使用交换分区
如果以上两条iptables的参数不生效,再执行modprobe ip_vs_rr
和modprobe br_netfilter
在执行sysctl -p
之前要确认docker服务已经启动了
[root@node1 ~]# sysctl -p
[root@node1 ~]# modprobe ip_vs_rr
[root@node1 ~]# modprobe br_netfilter
[root@node1 ~]# scp /etc/sysctl.conf root@node2:/etc
[root@node1 ~]# scp /etc/sysctl.conf root@node3:/etc
node2
[root@node2 ~]# sysctl -p
[root@node2 ~]# modprobe ip_vs_rr
[root@node2 ~]# modprobe br_netfilter
node3
[root@node3 ~]# sysctl -p
[root@node3 ~]# modprobe ip_vs_rr
[root@node3 ~]# modprobe br_netfilter
关闭swap分区
三台操作同样,这一步不要scp,因为fstab不一样
swapoff -a
vim /etc/fstab
# 将分区类型为swap的一行注释掉
/dev/mapper/centos-swap swap
查看是否关闭
[root@node1 ~]# free -m
total used free shared buff/cache available
Mem: 3770 793 2151 21 825 2732
Swap: 0 0 0
kubernetes安装
这里使用阿里云镜像站安装
node1
进入上面这个页面,使用centos的yum源
[root@node1 ~]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
将yum源传给每台主机
[root@node1 ~]# scp /etc/yum.repos.d/kubernetes.repo root@node2:/etc/yum.repos.d/
[root@node1 ~]# scp /etc/yum.repos.d/kubernetes.repo root@node3:/etc/yum.repos.d/
node1/2/3
yum install -y kubelet kubeadm kubectl
kubeadm
:引导集群的命令。kubelet
:在群集中所有计算机上运行的组件,它执行诸如启动Pod和容器之类的操作。kubectl
:用于与您的集群通信的命令行工具。
查看版本
[root@node1 ~]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.1",
GitCommit:"7879fc12a63337efff607952a323df90cdc7a335", GitTreeState:"clean",
BuildDate:"2020-04-08T17:36:32Z", GoVersion:"go1.13.9", Compiler:"gc",
Platform:"linux/amd64"}
安装kubernetes的tab快捷键
[root@node1 ~]# yum -y install bash-completion
[root@node1 ~]# source <(kubectl completion bash)
[root@node1 ~]# source <(kubeadm completion bash)
[root@node1 ~]# vim .bashrc
# 末尾添加
source <(kubeadm completion bash)
source <(kubectl completion bash)
三台启动服务
systemctl enable kubelet.service && systemctl start kubelet.service
此时会启动失败,因为此时的配置还没初始化完成,所以此时不能启动kubelet,等后续kubeadm启动成功后再查看
kubernetes初始化集群
node1
执行这条后会等待一段时间,需要进行下载镜像
[root@node1 ~]# kubeadm init --apiserver-advertise-address 192.168.1.11 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.1 --pod-network-cidr=10.16.0.0/16
# 参数释义
--apiserver-advertise-address:通告侦听地址
--image-repository:指定镜像地址使用阿里云的,默认会使用谷歌镜像
--kubernetes-version:指定当前的kubernetes的版本
--pod-network-cidr=10.16.0.0/16:kube-ovn网络的默认地址范围
完成后会有以下输出信息
# 如果使用普通账号操作,执行以下三条
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 部署集群网络
https://kubernetes.io/docs/concepts/cluster-administration/addons/
# 其他kubernetes主机通过以下命令加入kubernetes集群
kubeadm join 192.168.1.11:6443 --token jmgcow.rbwqh31v4mu4au33 \
--discovery-token-ca-cert-hash sha256:9f77bfd2748541ebacd21566de825073bfeb1c7a0515c0284f7308446d9d5f54
如果是root用户先执行以下命令
[root@node1 ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
[root@node1 ~]# vim .bashrc
# 末尾添加
export KUBECONFIG=/etc/kubernetes/admin.conf
node2/3加入集群
node2/3
在node2和node3中执行初始化集群后的输出命令,也就是join这条
kubeadm join 192.168.1.11:6443 --token jmgcow.rbwqh31v4mu4au33 \
--discovery-token-ca-cert-hash sha256:9f77bfd2748541ebacd21566de825073bfeb1c7a0515c0284f7308446d9d5f54
完成后输出一下信息
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
node1
查看集群状态
[root@node1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 NotReady master 2m25s v1.18.1
node2 NotReady <none> 15s v1.18.1
node3 NotReady <none> 10s v1.18.1
看到STATUS都为NotReady,未准备好,是因为每台集群的网络插件还没有准备好
集群网络(kube-ovn)部署
Kubernetes的网络都是使用pod来启用的
系统/内核要求
- CentOS 7.5/7.6/7.7, 内核版本需要大于 3.10.0-898
- Ubuntu 16.04,需要升级内核至 4.13 以上或者自行编译 ovs 2.12.0 内核模块
- Ubuntu 18.04
ubuntu的就不多赘述了
关于这个网络的原理还是等我弄明白了,再写吧,先做安装
部署CRD(CustomResourceDefinitio)自定义资源定义
CRD用来管理自定义对象,也就是用来管理即将部署的kube-ovn网络的
kube-ovn创建了Subnet&IP&Vlan三种CRD资源管理网络
如果是公司走的国外代理的网络,可以直接运行以下命令
[root@node1 ~]# kubectl apply -f https://raw.githubusercontent.com/alauda/kube-ovn/master/yamls/crd.yaml
如果是使用的国内网络,很有可能访问github都是个问题,可使用VPN进行下载文件
打开页面后,复制内容,在服务器上创建文件,粘贴即可
[root@node1 ~]# vim crd.yaml
# 粘贴内容
# 创建crd
[root@node1 ~]# kubectl apply -f crd.yaml
customresourcedefinition.apiextensions.k8s.io/ips.kubeovn.io created
customresourcedefinition.apiextensions.k8s.io/subnets.kubeovn.io created
customresourcedefinition.apiextensions.k8s.io/vlans.kubeovn.io created
查看crd
[root@node1 ~]# kubectl get crd
NAME CREATED AT
ips.kubeovn.io 2020-10-16T08:31:09Z
subnets.kubeovn.io 2020-10-16T08:31:09Z
vlans.kubeovn.io 2020-10-16T08:31:09Z
部署ovs/ovn
ovn是有专门的数据库来存储网络信息的,需要将数据存在宿主机硬盘来做数据持久化,为了保证数据库的高可用,可以在多个节点(奇数个)部署ovndb,需要给部署ovndb的节点打标签进行部署
打标签
[root@node1 ~]# kubectl label node node1 node2 node3 kube-ovn/role=master
node/node1 labeled
node/node2 labeled
node/node3 labeled
下载文件
同样使用yaml文件进行部署
- 国外代理部署方法
[root@node1 ~]# kubectl apply -f https://raw.githubusercontent.com/alauda/kube-ovn/master/yamls/ovn.yaml
- 国内部署方法
打开页面后,复制内容,在服务器上创建文件,粘贴即可
[root@node1 ~]# vim ovn.yaml
# 粘贴内容
ovndb高可用修改
不做高可用可以略过这步
修改ovn.yaml文件中ovndb的副本数量
# 修改副本数量
# 找到ovn-central的位置,修改replicas的值为3(修改过节点标签的个数)
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: ovn-central
namespace: kube-system
annotations:
kubernetes.io/description: |
OVN components: northd, nb and sb.
spec:
replicas: 3
# 将3个节点的ip添加到POD_IP上面
env:
- name: ENABLE_SSL
value: "false"
- name: NODE_IPS
value: 192.168.1.11,192.168.1.12,192.168.1.13
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
部署ovs/ovn
[root@node1 ~]# kubectl apply -f ovn.yaml
podsecuritypolicy.policy/kube-ovn created
configmap/ovn-config created
serviceaccount/ovn created
clusterrole.rbac.authorization.k8s.io/system:ovn created
clusterrolebinding.rbac.authorization.k8s.io/ovn created
service/ovn-nb created
service/ovn-sb created
deployment.apps/ovn-central created
daemonset.apps/ovs-ovn created
查看pod
[root@node1 ~]# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7ff77c879f-58tdj 0/1 Pending 0 3m51s
kube-system coredns-7ff77c879f-c9ssd 0/1 Pending 0 3m51s
kube-system etcd-node1 1/1 Running 0 4m8s
kube-system kube-apiserver-node1 1/1 Running 0 4m8s
kube-system kube-controller-manager-node1 1/1 Running 0 4m8s
kube-system kube-proxy-6g2p4 1/1 Running 0 3m51s
kube-system kube-proxy-stpvv 1/1 Running 0 3m18s
kube-system kube-proxy-sv2ld 1/1 Running 0 3m14s
kube-system kube-scheduler-node1 1/1 Running 0 4m8s
kube-system ovn-central-856ff6c66f-kkqrh 0/1 ContainerCreating 0 10s
kube-system ovn-central-856ff6c66f-kn4vr 0/1 ContainerCreating 0 10s
kube-system ovn-central-856ff6c66f-rf25j 0/1 ContainerCreating 0 10s
kube-system ovs-ovn-gsgfh 0/1 ContainerCreating 0 10s
kube-system ovs-ovn-gvdm5 0/1 ContainerCreating 0 10s
kube-system ovs-ovn-z9hjf 0/1 ContainerCreating 0 10s
关于ovn的6个pod状态全是ContainerCreating,是因为各节点正在下载启动pod所需的镜像,也是因为是国外的资源所以下载很慢,要等很长时间
我这里因为提前下好了镜像,所以很快就好了
[root@node1 ~]# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7ff77c879f-58tdj 0/1 Pending 0 11m
kube-system coredns-7ff77c879f-c9ssd 0/1 Pending 0 11m
kube-system etcd-node1 1/1 Running 0 12m
kube-system kube-apiserver-node1 1/1 Running 0 12m
kube-system kube-controller-manager-node1 1/1 Running 0 12m
kube-system kube-proxy-6g2p4 1/1 Running 0 11m
kube-system kube-proxy-stpvv 1/1 Running 0 11m
kube-system kube-proxy-sv2ld 1/1 Running 0 11m
kube-system kube-scheduler-node1 1/1 Running 0 12m
kube-system ovn-central-856ff6c66f-kkqrh 1/1 Running 1 8m4s
kube-system ovn-central-856ff6c66f-kn4vr 1/1 Running 0 8m4s
kube-system ovn-central-856ff6c66f-rf25j 1/1 Running 1 8m4s
kube-system ovs-ovn-gsgfh 1/1 Running 0 8m4s
kube-system ovs-ovn-gvdm5 1/1 Running 0 8m4s
kube-system ovs-ovn-z9hjf 1/1 Running 0 8m4s
安装 Kube-OVN Controller 及 CNIServer
Kube-OVN Controller 和 CNIServer 中有大量可配参数,这里为了快速上手,我们不做更改。默认配置下 Kube-OVN 会使用 10.16.0.0/16 作为默认子网,100.64.0.1/16 作为主机和 Pod 通信子网,使用 Kubernetes 中的 Node 主网卡作为 Pod 流量通信使用网卡,并开启流量镜像功能。
下载文件
同样使用yaml文件进行部署
- 国外代理部署方法
[root@node1 ~]# kubectl apply -f https://raw.githubusercontent.com/alauda/kube-ovn/master/yamls/kube-ovn.yaml
- 国内部署方法
打开页面后,复制内容,在服务器上创建文件,粘贴即可
[root@node1 ~]# vim kube-ovn.yaml
# 粘贴内容
# 直接部署
[root@node1 ~]# kubectl apply -f kube-ovn.yaml
deployment.apps/kube-ovn-controller created
daemonset.apps/kube-ovn-cni created
daemonset.apps/kube-ovn-pinger created
service/kube-ovn-pinger created
service/kube-ovn-controller created
service/kube-ovn-cni created
查看pod状态
[root@node1 ~]# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7ff77c879f-58tdj 1/1 Running 0 14m
kube-system coredns-7ff77c879f-c9ssd 1/1 Running 0 14m
kube-system etcd-node1 1/1 Running 0 14m
kube-system kube-apiserver-node1 1/1 Running 0 14m
kube-system kube-controller-manager-node1 1/1 Running 0 14m
kube-system kube-ovn-cni-22nfb 1/1 Running 0 80s
kube-system kube-ovn-cni-dhd45 1/1 Running 0 80s
kube-system kube-ovn-cni-mqdwx 1/1 Running 0 80s
kube-system kube-ovn-controller-d577b88f4-fhbwk 1/1 Running 0 80s
kube-system kube-ovn-pinger-5f9t7 1/1 Running 0 80s
kube-system kube-ovn-pinger-8rhh7 1/1 Running 0 80s
kube-system kube-ovn-pinger-svzzk 1/1 Running 0 80s
kube-system kube-proxy-6g2p4 1/1 Running 0 14m
kube-system kube-proxy-stpvv 1/1 Running 0 13m
kube-system kube-proxy-sv2ld 1/1 Running 0 13m
kube-system kube-scheduler-node1 1/1 Running 0 14m
kube-system ovn-central-856ff6c66f-kkqrh 1/1 Running 1 10m
kube-system ovn-central-856ff6c66f-kn4vr 1/1 Running 0 10m
kube-system ovn-central-856ff6c66f-rf25j 1/1 Running 1 10m
kube-system ovs-ovn-gsgfh 1/1 Running 0 10m
kube-system ovs-ovn-gvdm5 1/1 Running 0 10m
kube-system ovs-ovn-z9hjf 1/1 Running 0 10m
直到全部running后,再次查看node节点状态
[root@node1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready master 110m v1.18.1
node2 Ready <none> 108m v1.18.1
node3 Ready <none> 108m v1.18.1
已全部为Ready,集群部署成功
安装kubectl-ko网络检测工具
为了更好地对网络质量进行监控以及对故障进行排查,kube-ovn提供了kubectl的插件kubectl-ko
下载kubectl-ko
文件
kubectl-ko因国内网络原因无法使用raw页面直接wget,所以只能打开复制内容
打开页面后,复制内容,在服务器上创建文件,粘贴即可
[root@node1 ~]# vim kubectl-ko
# 粘贴内容
# 授权
[root@node1 ~]# chmod +x kubectl-ko
# 放到可识别路径下
[root@node1 ~]# mv kubectl-ko /usr/local/bin/kubectl-ko
查看插件
[root@node1 ~]# kubectl plugin list
The following compatible plugins are available:
/usr/local/bin/kubectl-ko
对pod的网络质量进行检查
[root@node1 ~]# kubectl ko diagnose all
# 最后输出一下即可
### finish diagnose node node1
OK!完成
如果有的pod始终起不来,要么尝试重启pod,要么重新做集群,或者卸载kube-ovn网络,重新部署
2021-1-9更新
新版本的kube-ovn提供了脚本一键安装,因为新版本下载yaml文件已经有点问题了,为了方便,直接使用脚本安装即可。
在master节点下载脚本
执行脚本之前要给节点添加node
kubectl label node node1 {node_hostname} kube-ovn/role=master
使用了代理的网络可直接执行脚本
# wget https://raw.githubusercontent.com/alauda/kube-ovn/v1.6.0/dist/images/install.sh
# chmod +x install.sh
# ./install.sh
国内网络的用户可以访问github项目并复制脚本内容,粘贴到服务器,也可以使用我站点的文件
wget https://www.feiyiblog.com/files/kubeovn/install.sh
等待下载镜像完成即可
无论是单节点还是多节点的集群,脚本会根据label的数量,判断pod是否会高可用