前言
环境介绍
搭建环境为CentOS7,并且预先安装了docker,安装docker的过程参考博文Docker(一)–Docker的基本用法,CPU为2核,硬盘20G。
节点说明
主机名 | IP | 角色 |
---|---|---|
k8s-master | 192.168.252.24 | master |
k8s-node1 | 192.168.252.25 | node |
本次集群搭建采用一台master + 一台node,master和node搭建过程类似
服务器准备
1. 主机名修改
# 192.168.252.24
hostnamectl set-hostname k8s-master
# 192.168.252.25
hostnamectl set-hostname k8s-node1
2.IP设置
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static # 设置为静态IP
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=117b2766-a256-4527-8f19-ea687de5a4a3
DEVICE=ens33
ONBOOT=yes # 开机加载
IPADDR=192.168.252.24 #设置IP,node服务器同理
GATEWAY=192.168.252.1 #设置网关
DNS1=8.8.8.8 #设置DNS
DNS2=8.8.4.4
3. 设置hosts
192.168.252.24 k8s-master
192.168.252.25 k8s-node1
4. 关闭swap交换区
#关闭 swap交换区
swapoff -a
# 查看swap是否关闭
free -m
total used free shared buff/cache available
Mem: 1819 602 186 9 1030 1027
Swap: 0 0 0
# 禁用自动挂载swap
vim /etc/fstab
#注释 swap挂载
#/dev/mapper/centos-swap swap swap defaults 0 0
#重新挂载
mount -a
5. 修改iptables相关参数
RHEL / CentOS 7上的一些用户报告了由于iptables被绕过而导致流量路由不正确的问题。创建/etc/sysctl.d/k8s.conf文件,添加如下内容
cat <<EOF > /etc/sysctl.d/k8s.conf
vm.swappiness = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
5. 加载ipvs相关模块
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
#执行脚本
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
上面脚本创建了/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块。 使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。
接下来还需要确保各个节点上已经安装了ipset软件包。 为了便于查看ipvs的代理规则,最好安装一下管理工具ipvsadm。
yum install ipset ipvsadm -y
安装kubernetes
1. 设置国内阿里云镜像源
cat <<EOF > /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
EOF
2. 安装kubernetes
- 安装kubeadm、kubelet、kubectl
官方安装文档可以参考:
https://kubernetes.io/docs/setup/independent/install-kubeadm/
- kubelet 在群集中所有节点上运行的核心组件, 用来执行如启动pods和containers等操作。
- ubeadm 引导启动k8s集群的命令行工具,用于初始化 Cluster。
- kubectl 是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。
yum install -y kubelet kubeadm kubectl
#启动kubelet服务
systemctl enable kubelet && systemctl start kubelet
3.部署kubernetes
3.1 部署master节点
使用kubeadm init命令执行master初始化
kubeadm init \
--apiserver-advertise-address=192.168.252.24 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.17.0 \
--pod-network-cidr=10.244.0.0/16
命令说明:
--apiserver-advertise-address
指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。
--image-repository
指定镜像仓库,默认为k8s.gcr.io,但国内没梯子访问不了,因此设置为阿里云的镜像registry.aliyuncs.com/google_containers
--kubernetes-version
指定kubernetes的版本号
--pod-network-cidr
指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 --pod-network-cidr 有自己的要求,这里设置为 10.244.0.0/16 是因为后续我们将使用 flannel 网络方案,必须设置成这个 CIDR。
初始化执行完成后,kubernetes推荐使用普通用户执行kubectl,我们这里直接使用root用户
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
还会给出节点加入集群的命令
kubeadm join 192.168.252.24:6443 --token vktgmp.4xksid5cri1axehb --discovery-token-ca-cert-hash sha256:711dcd3f6a351cbdb17255d1141fab3f99a03486fb96e3669d569be094af528a
如果没有记住该命令,可以使用以下命令找回
kubeadm token create --print-join-command
查看集群健康状态
[root@k8s-master ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
安装完成后CoreDNS依赖于网络的 Pod 都会处于 Pending 状态,即调度失败。因为此时没有安装网络插件,pod间无法通信。
安装过程中如果遇到问题无法解决,可以使用kubeadm reset重置然后重新执行初始化。
要让 Kubernetes Cluster 能够工作,必须安装 Pod 网络,否则 Pod 之间无法通信。
Kubernetes 支持多种网络方案,这里我们使用 flannel
执行如下命令部署 flannel:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
[root@k8s-master ~]$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.extensions/kube-flannel-ds-amd64 created
daemonset.extensions/kube-flannel-ds-arm64 created
daemonset.extensions/kube-flannel-ds-arm created
daemonset.extensions/kube-flannel-ds-ppc64le created
daemonset.extensions/kube-flannel-ds-s390x created
kubectl get pod -n kube-system -o wide 查看pod状态
# 安装完成后
[root@k8s-master ~]# kubectl get pod -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-9d85f5447-cnpcf 1/1 Running 1 19h 10.244.0.5 k8s-master <none> <none>
coredns-9d85f5447-ddjdn 1/1 Running 1 19h 10.244.0.4 k8s-master <none> <none>
etcd-k8s-master 1/1 Running 1 19h 192.168.252.24 k8s-master <none> <none>
kube-apiserver-k8s-master 1/1 Running 1 19h 192.168.252.24 k8s-master <none> <none>
kube-controller-manager-k8s-master 1/1 Running 10 19h 192.168.252.24 k8s-master <none> <none>
kube-flannel-ds-amd64-6phtp 1/1 Running 0 19h 192.168.252.25 k8s-node1 <none> <none>
kube-flannel-ds-amd64-9bdzm 1/1 Running 1 19h 192.168.252.24 k8s-master <none> <none>
kube-proxy-b727v 1/1 Running 0 19h 192.168.252.25 k8s-node1 <none> <none>
kube-proxy-st86r 1/1 Running 1 19h 192.168.252.24 k8s-master <none> <none>
kube-scheduler-k8s-master 1/1 Running 8 19h 192.168.252.24 k8s-master <none> <none>
安装完flannel之后等待一会儿或者重启,可以看到coredns和flannel都启动起来了。
至此,master节点部署完毕。
3.2 部署node节点
node节点的部署几乎和master一样,步骤走到安装完kubelet,kubeadm,kubectl的地方,然后执行master节点安装时的加入集群命令
kubeadm join 192.168.252.24:6443 --token vktgmp.4xksid5cri1axehb --discovery-token-ca-cert-hash sha256:711dcd3f6a351cbdb17255d1141fab3f99a03486fb96e3669d569be094af528a
执行完成后查看pod状态,如果均为running状态,那么就大功告成了
部署应用
启动两个nginx,并且暴露端口80,镜像采用nginx
kubectl run nginx --image=nginx --port=80 --replicas=2
查看deployment
[root@k8s-master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 2/2 2 2 12m
此时可以看到两个nginx都已经READY
暴露服务
[root@k8s-master ~]# kubectl expose deployment nginx --port=8081 --target-port=80 --type=LoadBalancer
service/nginx exposed
查看服务
[root@k8s-master ~]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 20h
nginx LoadBalancer 10.96.73.222 <pending> 8081:31808/TCP 2s
此时使用浏览器访问192.168.252.24:31808,可以看到访问成功