kubernetes官网

安装环境

不支持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安装

这里使用阿里云镜像站安装

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进行下载文件

打开crd.yaml文件

打开页面后,复制内容,在服务器上创建文件,粘贴即可

[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
  • 国内部署方法

打开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
  • 国内部署方法

打开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项目并复制脚本内容,粘贴到服务器,也可以使用我站点的文件

github->install.sh

wget https://www.feiyiblog.com/files/kubeovn/install.sh

等待下载镜像完成即可

无论是单节点还是多节点的集群,脚本会根据label的数量,判断pod是否会高可用

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0