使用 Kubeadm 搭建 Kubernetes 集群

用户头像
Java收录阁
关注
发布于: 2020 年 04 月 30 日
使用Kubeadm搭建Kubernetes集群

官网:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

GitHubhttps://github.com/kubernetes/kubeadm



我们使用kubeadm搭建一个3台机器组成的k8s集群,1台master节点,2台worker节点

虚拟机配置要求



一、版本要求

为了避免版本不一致导致的问题,我们先统一一下版本。

  • Docker 18.09.0

  • kubeadm-1.14.0-0

  • kubelet-1.14.0-0

  • kubectl-1.14.0-0

  • k8s.gcr.io/kube-apiserver:v1.14.0

  • k8s.gcr.io/kube-controller-manager:v1.14.0

  • k8s.gcr.io/kube-scheduler:v1.14.0

  • k8s.gcr.io/kube-proxy:v1.14.0

  • k8s.gcr.io/pause:3.1

  • k8s.gcr.io/etcd:3.3.10

  • k8s.gcr.io/coredns:1.3.1

  • calico:v3.9



二、 准备虚拟机

我们需要准备3台Centos虚拟机,Windows中搭建使用Vagrant + virtualbox搭建步骤

  1. 在Windows中创建虚拟机目录

E:\Kubernetes\VM\k8s-docker-centos7

  1. 在该目录下创建Vagrantfile file,在文件中定义3台虚拟机并指定IP以及内存等信息

boxes = [
{
:name => "master-kubeadm-k8s",
:eth1 => "192.168.0.51",
:mem => "2048",
:cpu => "2"
},
{
:name => "worker01-kubeadm-k8s",
:eth1 => "192.168.0.61",
:mem => "2048",
:cpu => "2"
},
{
:name => "worker02-kubeadm-k8s",
:eth1 => "192.168.0.62",
:mem => "2048",
:cpu => "2"
}
]

Vagrant.configure(2) do |config|

config.vm.box = "centos/7"
boxes.each do |opts|
config.vm.define opts[:name] do |config|
config.vm.hostname = opts[:name]
config.vm.provider "vmware_fusion" do |v|
v.vmx["memsize"] = opts[:mem]
v.vmx["numvcpus"] = opts[:cpu]
end

config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--memory", opts[:mem]]
v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
v.customize ["modifyvm", :id, "--name", opts[:name]]
end

config.vm.network :public_network, ip: opts[:eth1]
end
end

end



  1. 运行vagrant up启动虚拟机





  1. 通过vagrant ssh master-kubeadm-k8s命令进入虚拟机并作如下修改之后(3台虚拟机都需要),可以使用root账户登陆

sudo -i
vi /etc/ssh/sshd_config
修改PasswordAuthentication yes
passwd [修改密码]
systemctl restart sshd [重启sshd服务]





  1. 通过root账户登陆3台虚拟机,确保都能够彼此ping通



三、更新并安装依赖

3台机器都需要执行下面命令

yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp



四、安装Docker

3台机器都需要执行,安装版本为18.09.0

  1. 卸载之前安装的docker

sudo yum remove docker docker latest docker-latest-logrotate \
docker-logrotate docker-engine docker-client docker-client-latest docker-common
  1. 安装必要依赖

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  1. 添加软件源信息

sudo yum-config-manager \
--add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list | grep docker-ce
  1. 更新yum缓存

sudo yum makecache fast
  1. 添加阿里云镜像

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ns2jtf98.mirror.aliyuncs.com"]
}
EOF
  1. 安装Docker

sudo yum install -y docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io [指定安装docker版本]
  1. 启动docker并设置开机启动

sudo systemctl start docker && sudo systemctl enable docker
  1. 测试docker安装是否成功

sudo docker run hello-world



五、修改Host文件

  1. 设置master的hostname,并且修改hosts文件

sudo hostnamectl set-hostname m
  1. 设置worker01/02的hostname,并且修改hosts文件

sudo hostnamectl set-hostname w1
sudo hostnamectl set-hostname w2
  1. 修改3台机器的host文件

vi /etc/hosts
192.168.0.51 m
192.168.0.61 w1
192.168.0.62 w2
  1. 使用ping测试一下



六、系统基础前提配置

  1. 关闭防火墙

systemctl stop firewalld && systemctl disable firewalld
  1. 关闭selinux

setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
vi /etc/sysconfig/selinux
设置selinux = disabled
  1. 关闭swap

swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
  1. 配置iptables的ACCEPT规则

iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
  1. 设置系统参数

cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system



七、安装 kubeadm、kubelet 和 kubectl

  1. 配置yum源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF



  1. 安装kubeadm&kubelet&kubectl

yum install -y kubeadm-1.14.0-0 kubelet-1.14.0-0 kubectl-1.14.0-0



  1. docker和k8s设置同一个cgroup

# docker
vi /etc/docker/daemon.json
"exec-opts": ["native.cgroupdriver=systemd"],
systemctl restart docker
# # kubelet,这边如果发现输出directory not exist,也说明是没问题的,大家继续往下进行即可
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
systemctl enable kubelet && systemctl start kubelet



八、proxy/pause/scheduler等国内镜像

  1. 查看kubeadm使用的镜像

kubeadm config images list



可以发现这里都是国外的镜像

  1. 解决国外镜像不能访问的问题

创建kubeadm.sh脚本,用于拉取镜像/打tag/删除原有镜像

#!/bin/bash
set -e
KUBE_VERSION=v1.14.0
KUBE_PAUSE_VERSION=3.1
ETCD_VERSION=3.3.10
CORE_DNS_VERSION=1.3.1
GCR_URL=k8s.gcr.io
ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers
images=(kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns:${CORE_DNS_VERSION})
for imageName in ${images[@]} ; do
docker pull $ALIYUN_URL/$imageName
docker tag $ALIYUN_URL/$imageName $GCR_URL/$imageName
docker rmi $ALIYUN_URL/$imageName
done

运行脚本:

sh ./kubeadm.sh
# 查看镜像
docker images





九、kube init初始化master

官网: https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

  1. kube init流程(不需要我们做任何操作,只是介绍下流程)

01-进行一系列检查,以确定这台机器可以部署kubernetes
02-生成kubernetes对外提供服务所需要的各种证书可对应目录
/etc/kubernetes/pki/*
03-为其他组件生成访问kube-ApiServer所需的配置文件
ls /etc/kubernetes/
admin.conf controller-manager.conf kubelet.conf scheduler.conf
04-为 Master组件生成Pod配置文件。
ls /etc/kubernetes/manifests/*.yaml
kube-apiserver.yaml
kube-controller-manager.yaml
kube-scheduler.yaml
05-生成etcd的Pod YAML文件。
ls /etc/kubernetes/manifests/*.yaml
kube-apiserver.yaml
kube-controller-manager.yaml
kube-scheduler.yaml
etcd.yaml
06-一旦这些 YAML 文件出现在被 kubelet 监视的/etc/kubernetes/manifests/目录下,kubelet就会自动创建这些yaml文件定义的pod,即master组件的容器。master容器启动后,kubeadm会通过检查localhost:6443/healthz这个master组件的健康状态检查URL,等待master组件完全运行起来
07-为集群生成一个bootstrap token
08-将ca.crt等 Master节点的重要信息,通过ConfigMap的方式保存在etcd中,工后续部署node节点使用
09-最后一步是安装默认插件,kubernetes默认kube-proxy和DNS两个插件是必须安装的



  1. 初始化master节点

官网:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

注意此操作是在主节点上进行

#本地有镜像
kubeadm init --kubernetes-version=1.14.0 --apiserver-advertise-address=192.168.0.51 --pod-network-cidr=10.244.0.0/16
【若要重新初始化集群状态:kubeadm reset,然后再进行上述操作】
#注意:记得保存好最后kubeadm join的信息。





kubeadm join 192.168.0.51:6443 --token w471f7.crx583w5oy05wz40 \
--discovery-token-ca-cert-hash sha256:ee8654130e732eaa673ce834cf6b4c4c408a3b7ec1011d1d5952f0d01b1e4fed
  1. 根据日志提示

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

此时kubectl cluster-info查看一下是否成功

  1. 查看pod验证一下

等待一会儿,同时可以发现像etc,controller,scheduler等组件都以pod的方式安装成功了

注意:coredns没有启动,需要安装网络插件

kubectl get pods -n kube-system





  1. 健康检查

curl -k https://localhost:6443/healthz



十、部署calico网络插件

选择网络插件:<https://kubernetes.io/docs/concepts/cluster-administration/addons/>

calico网络插件:<https://docs.projectcalico.org/v3.9/getting-started/kubernetes/>



calico,同样在master节点上操作

# 在k8s中安装calico
kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml

# 确认一下calico是否安装成功
kubectl get pods --all-namespaces -w





十一、kube join

执行之前保存初始化master节点的最后打印信息

kubeadm join 192.168.0.51:6443 --token w471f7.crx583w5oy05wz40 \
--discovery-token-ca-cert-hash sha256:ee8654130e732eaa673ce834cf6b4c4c408a3b7ec1011d1d5952f0d01b1e4fed



  1. 在woker01和worker02上执行上述命令

  2. 在master节点上检查集群信息

到此为止,Kubernetes集群已经搭建完成。



十二、体验Pod

  1. 定义pod.yml文件,比如podnginxrs.yaml

cat > pod_nginx_rs.yaml <<EOF
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx
labels:
tier: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
name: nginx
labels:
tier: frontend
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
EOF



  1. 根据podnginxrs.yml文件创建pod

kubectl apply -f pod_nginx_rs.yaml
  1. 查看pod

kubectl get pods
kubectl get pods -o wide
kubectl describe pod nginx





  1. 感受通过rs将pod扩容

kubectl scale rs nginx --replicas=5
kubectl get pods -o wide





  1. 删除pod

kubectl delete -f pod_nginx_rs.yaml



发布于: 2020 年 04 月 30 日 阅读数: 99
用户头像

Java收录阁

关注

士不可以不弘毅,任重而道远 2020.04.30 加入

喜欢收集整理Java相关技术文档的程序员,欢迎关注同名微信公众号 Java收录 阁获取更多文章

评论

发布
暂无评论
使用Kubeadm搭建Kubernetes集群