安装环境
不支持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.244.0.0/16
# 参数释义
--apiserver-advertise-address:通告侦听地址
--image-repository:指定镜像地址使用阿里云的,默认会使用谷歌镜像
--kubernetes-version:指定当前的kubernetes的版本
--pod-network-cidr=10.244.0.0/16:flannel网络的固定地址范围
完成后会有以下输出信息
# 如果使用普通账号操作,执行以下三条
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
部署集群网络
浏览器打开改地址https://kubernetes.io/docs/concepts/cluster-administration/addons/
找到下图位置,点击flannel
进入Documentation目录下
找到kube-flannel.yml文件
找到该位置,此镜像需要使用docker下载
[root@node1 ~]# docker pull quay.io/coreos/flannel:v0.12.0-arm64
[root@node1 ~]# docker pull quay.io/coreos/flannel:v0.12.0-amd64
然后复制该页面的所有文件所有内容到以下文件
[root@node1 ~]# vim kube-flannel.yml
部署集群网络
[root@node1 ~]# kubectl apply -f kube-flannel.yml
node2/3加入集群
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
在node1运行kubectl get nodes
查看集群节点,状态的为Notready的是还没有准备好,多等一会,再去查看
[root@node1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready master 31m v1.18.1
node2 Ready <none> 21m v1.18.1
node3 Ready <none> 21m v1.18.1
重新查看集群状态
[root@node1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready master 34m v1.18.1
node2 Ready <none> 24m v1.18.1
node3 Ready <none> 24m v1.18.1
执行kubectl get pod --all-namespaces
,查看所有命名空间的pod,如果有状态为PodInitializing
,就多等一会,网络原因,pod插件没有下载好,多等等就好了,全部这台为running
即可
[root@node1 ~]# kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7ff77c879f-d67t7 1/1 Running 1 4m50s
kube-system coredns-7ff77c879f-qxvdc 1/1 Running 1 4m50s
kube-system etcd-node1 1/1 Running 0 4m56s
kube-system kube-apiserver-node1 1/1 Running 0 4m55s
kube-system kube-controller-manager-node1 1/1 Running 0 4m51s
kube-system kube-flannel-ds-amd64-4vqm6 1/1 Running 0 2m49s
kube-system kube-flannel-ds-amd64-nv8mm 1/1 Running 0 2m21s
kube-system kube-flannel-ds-amd64-v5w97 1/1 Running 0 2m26s
kube-system kube-proxy-bfccm 1/1 Running 0 2m26s
kube-system kube-proxy-jwr2f 1/1 Running 0 4m50s
kube-system kube-proxy-mf4r9 1/1 Running 0 2m21s
kube-system kube-scheduler-node1 1/1 Running 0 4m51s
集群搭建成功