最近一直在学习kubernetes,最近想要尝试自己搭建一个k8s集群,期间查看了各种博客,文档, 终于把集群搭建成功,写个博客记录一下.
准备环境
准备四台虚拟机,配置如下:
- OS:Centos 8
- CPU: 1核
- 内存:4GB
- 主机名分别为:k8s-master, k8s-n1, k8s-n2, k8s-n2
- 网络:在同一子网,ip分别为192.168.1.125,192.168.1.114,192.168.1.127,192.168.1.140
- 用户:root
Master 节点和Node 节点都需要执行的步骤
- 分别修改主机名
hostnamectl set-hostname k8s-master
- 修改host文件
在 /etc/hosts文件中添加如下配置:
192.168.1.114 k8s-n1
192.168.1.125 k8s-master
192.168.1.127 k8s-n2
192.168.1.140 k8s-n3
- 指定DNS服务器
(这步骤理论可以省略,主要是我发现我的虚拟机如果不指定DNS服务器,下载程序包时就经常性失败.)
在 /etc/resolv.conf 文件中加入:
nameserver 114.114.114.114
nameserver 8.8.8.8
- 安装Docker
这里我选择了较新的18.09.1版本,安装命令如下(参考官网):
yum install -y -q yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce-18.09.1 docker-ce-cli-18.09.1 containerd.io
systemctl enable docker
systemctl start docker
- 禁用Linux的selinux
setenforce 0
sed -i --follow-symlinks 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
- 关闭防火墙
集群通信需要用到许多端口,防火墙的设置也很麻烦,所以这里偷懒,就直接关闭掉了.
systemctl disable firewalld
systemctl stop firewalld
- 禁用swap
禁用swap的原因,我个人理解是目前kubelet 还不能很好支持不同pod对swap的不同需求,为了保证分配的内存都是真实可靠的,所以干脆禁用了swap。
禁用命令:
sed -i '/swap/d' /etc/fstab
swapoff -a
- 配置网络参数
cat >>/etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
- 配置kubernetes的国内镜像
由于国内长城的原因,需要配置kubernetes的国内镜像
cat >>/etc/yum.repos.d/kubernetes.repo<<EOF
[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
- 安装kubeadm,kubelet,kubectl
yum install -y kubeadm kubelet kubectl
systemctl enable kubelet
systemctl start kubelet
Master节点单独执行的步骤
- 查看安装所需要的Docker镜像,这里我们装较新的1.16.1版本的Kubernetes
kubeadm config images list --kubernetes-version=1.16.1
- 使用国内镜像库拉取镜像
因为国内无法访问" k8s.gcr.io"镜像库,需要先从"registry.cn-hangzhou.aliyuncs.com"拉取镜像.
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.16.1
给拉取后的镜像,打上”k8s.gcr.io”的tag
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.16.1 k8s.gcr.io/kube-apiserver:v1.16.1
- 使用Kubeadm开始安装Kubernetes集群
kubeadm init --kubernetes-version=v1.16.1 --apiserver-advertise-address=192.168.1.125 --pod-network-cidr 10.244.0.0/16
- 给当前用户(root)配置Kube Config File
此步骤目的是使当前用户可以通过kubectl 来访问集群
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
- 安装网络插件(flannel)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- 设置Forward Policy
sudo iptables -P FORWARD ACCEPT
- 修改pod coredns的configmap
kubectl edit configmap coredns -n kube-system
添加hosts,如图
Node节点上的操作
- 设置Forward Policy
sudo iptables -P FORWARD ACCEPT
- 生成join command
在Master节点上执行下边命令
kubeadm token create --print-join-command
-
Node节点通过Kubeadm连接Master节点
复制上步生成的命令,执行就可. -
手动下载Node节点需要的相关镜像
由于Node节点也会用到一些"k8s.gcr.io"中的镜像,例如"k8s.gcr.io/kube-proxy “,所以也需要手动下载相关的包,并打上"k8s.gcr.io” tag.
先获取所有的pod:
kubectl get pods --all-namespaces -o wide
找到状态不是running的pod,通过"kubectl describe pod"命令可以查看是不是pull image 失败.
到此,kubernetes集群就搭建成功了!