Kubernetes - 使用Kubeadm搭建Kubernetes集群
官网:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/GitHub:https://github.com/kubernetes/kubeadm我们使用kubeadm搭建一个3台机器组成的k8s集群,1台master节点,2台worker节点虚拟机配置要求一...
国庆期间闲来无事,写了一个简单的小程序,小程序名称叫做 IT藏经楼。目的是分享这些年自己积累的一些学习材料,方面大家查找使用,包括电子书、案例项目、学习视频、面试题和一些PPT模板。里面所有材料都免费分享。目前小程序中只发布了非常小的一部分,后续会陆续上传分享。当前版本的小程序页面也比较简单,还在逐渐的优化中。
官网
:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
GitHub
:https://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搭建步骤:
- 在Windows中创建虚拟机目录
E:\Kubernetes\VM\k8s-docker-centos7 - 在该目录下创建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
- 运行vagrant up启动虚拟机
- 通过vagrant ssh master-kubeadm-k8s命令进入虚拟机并作如下修改之后(3台虚拟机都需要),可以使用root账户登陆
sudo -i
vi /etc/ssh/sshd_config
修改PasswordAuthentication yes
passwd [修改密码]
systemctl restart sshd [重启sshd服务]
5. 通过root账户登陆3台虚拟机,确保都能够彼此ping通
三、更新并安装依赖
3台机器都需要执行下面命令
yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
四、安装Docker
3台机器都需要执行,安装版本为18.09.0
- 卸载之前安装的docker
sudo yum remove docker docker latest docker-latest-logrotate \ docker-logrotate docker-engine docker-client docker-client-latest docker-common
- 安装必要依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 添加软件源信息
sudo yum-config-manager \ --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum list | grep docker-ce
- 更新yum缓存
sudo yum makecache fast
- 添加阿里云镜像
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://ns2jtf98.mirror.aliyuncs.com"] } EOF
- 安装Docker
sudo yum install -y docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io [指定安装docker版本]
- 启动docker并设置开机启动
sudo systemctl start docker && sudo systemctl enable docker
- 测试docker安装是否成功
sudo docker run hello-world
五、修改Host文件
- 设置master的hostname,并且修改hosts文件
sudo hostnamectl set-hostname m
- 设置worker01/02的hostname,并且修改hosts文件
sudo hostnamectl set-hostname w1 sudo hostnamectl set-hostname w2
- 修改3台机器的host文件
vi /etc/hosts 192.168.0.51 m 192.168.0.61 w1 192.168.0.62 w2
- 使用ping测试一下
六、系统基础前提配置
- 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
- 关闭selinux
setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config vi /etc/sysconfig/selinux 设置selinux = disabled
- 关闭swap
swapoff -a sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
- 配置iptables的ACCEPT规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
- 设置系统参数
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
- 配置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
- 安装kubeadm&kubelet&kubectl
yum install -y kubeadm-1.14.0-0 kubelet-1.14.0-0 kubectl-1.14.0-0
- 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等国内镜像
- 查看kubeadm使用的镜像
可以发现这里都是国外的镜像kubeadm config images list
- 解决国外镜像不能访问的问题
创建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/
- 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两个插件是必须安装的
- 初始化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
- 根据日志提示
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查看一下是否成功
4. 查看pod验证一下
等待一会儿,同时可以发现像etc,controller,scheduler等组件都以pod的方式安装成功了
注意
:coredns没有启动,需要安装网络插件
kubectl get pods -n kube-system
5. 健康检查
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
- 在woker01和worker02上执行上述命令
- 在master节点上检查集群信息
到此为止,Kubernetes集群已经搭建完成。
十二、体验Pod
- 定义pod.yml文件,比如pod_nginx_rs.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
- 根据pod_nginx_rs.yml文件创建pod
kubectl apply -f pod_nginx_rs.yaml
- 查看pod
kubectl get pods
kubectl get pods -o wide
kubectl describe pod nginx
4. 感受通过rs将pod扩容
kubectl scale rs nginx --replicas=5
kubectl get pods -o wide
5. 删除pod
kubectl delete -f pod_nginx_rs.yaml
更多推荐
所有评论(0)