K8S篇-K8S的搭建
K8S核心组件和架构图K8S也叫Kubernetes,是一种容器编排工具K8S的最小操作单位是Pod,Pod中有一个或多个Container;Pod是ReplicaSet通过selector来进行管理;ReplicaSet之上是由Deployment进行管理。Label将Pod进行分门别类,具有相同label的Pod成为一个Service一个机器成为一个节点node,一个node上可以允许多个Po
目录
安装kubeadm, kubelet and kubectl
K8S核心组件和架构图
K8S也叫Kubernetes,是一种容器编排工具
K8S的最小操作单位是Pod,Pod中有一个或多个Container;Pod是ReplicaSet通过selector来进行管理;ReplicaSet之上是由Deployment进行管理。
Label将Pod进行分门别类,具有相同label的Pod成为一个Service
一个机器成为一个节点node,一个node上可以允许多个Pod,多个node组成一个集群。下面是一个K8S集群的
图中各个组件的含义
01-一个操作集群的客户端,也就是和集群打交道
kubectl
02-请求到达Master Node,然后再分配给Worker Node创建Pod之类的
关键是命令通过kubectl过来之后,要认证授权。
03-请求过来之后,Master Node中APIServer来接收。
04-API收到请求之后,接下来调用哪个Worker Node创建Pod,Container之类的,得要有调度策略
Scheduler
05-Scheduler通过不同的策略,真正要分发请求到不同的Worker Node上创建内容,具体由Controller Manager负责
06-Worker Node接收到创建请求之后,具体谁来负责
Kubelet服务,最终Kubelet会调用Docker Engine,创建对应的容器
07-DNS涉及到域名解析。
08-Dashboard监测整个集群的状态
09-ETCD保存集群中的数据,分布式存储
K8S集群的搭建
准备3台centos
创建目录k8s-docker-centos7,创建Vagrantfile文件
boxes = [
{
:name => "master-kubeadm-k8s",
:eth1 => "192.168.1.51",
:mem => "2048",
:cpu => "2",
:sshport => 22230
},
{
:name => "worker01-kubeadm-k8s",
:eth1 => "192.168.1.52",
:mem => "2048",
:cpu => "2",
:sshport => 22231
},
{
:name => "worker02-kubeadm-k8s",
:eth1 => "192.168.1.53",
:mem => "2048",
:cpu => "2",
:sshport => 22232
}
]
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.network :public_network, ip: opts[:eth1]
config.vm.network "forwarded_port", guest: 22, host: 2222, id: "ssh", disabled: "true"
config.vm.network "forwarded_port", guest: 22, host: opts[:sshport]
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
end
end
end
vagrant up启动虚拟机,vagrant ssh master-kubeadm-k8s [进入manager-node],vagrant ssh worker01-kubeadm-k8s [进入worker01-node],vagrant ssh worker02-kubeadm-k8s [进入worker02-node]
分别登陆三个节点,执行下面操作
sudo -i [进入root账户]
vi /etc/ssh/sshd_config [设置root账户可以密码登陆]
修改PasswordAuthentication yes
passwd [修改密码]
systemctl restart sshd [重启sshd服务]
更新并安装依赖
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
- 安装docker
sudo yum install -y docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io
- 启动docker并设置开机启动
sudo systemctl start docker && sudo systemctl enable docker
修改hosts文件
- 设置master的hostname,并且修改hosts文件
sudo hostnamectl set-hostname m
- 设置worker01/02的hostname,并且修改hosts文件
sudo hostnamectl set-hostname w1 sudo hostnamectl set-hostname w2
- 三台机器添加hosts文件
vi /etc/hosts # ==================================================================================== 10.13.11.21 m 10.13.11.22 w1 10.13.11.23 w2 # ====================================================================================
- 使用ping测试一下
ping m ping w1 ping w2
系统基础前提配置
- 关闭防火墙,放开所有端口
systemctl stop firewalld && systemctl disable firewalld
- 关闭selinux,SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则),用来加强安全性的一个组件,但非常容易出错且难以定位。为减少搭建时不必要的麻烦
setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
- 关闭swap,这个当内存不足时,linux会自动使用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 and 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 ,我这里原先是安装了1.14.0-0版本,但是报错依赖包没有,为了减少额外的麻烦,我这里直接安装了最新的版本
yum install -y kubeadm kubelet kubectl
- docker和k8s设置同一个cgroup
# docker vi /etc/docker/daemon.json 【文件没内容的话,就新建;有的话,就加上这一句,注意文件的格式[逗号]】 # ==================================================================================== { "exec-opts": ["native.cgroupdriver=systemd"] } # ==================================================================================== systemctl restart docker 【`重启docker,一定要执行`】 # kubelet 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 【`重启kubelet,一定要执行`】
拉取镜像
- 查看kubeadm使用的镜像
kubeadm config images list # ==================================================================================== k8s.gcr.io/kube-apiserver:v1.20.0 k8s.gcr.io/kube-controller-manager:v1.20.0 k8s.gcr.io/kube-scheduler:v1.20.0 k8s.gcr.io/kube-proxy:v1.20.0 k8s.gcr.io/pause:3.2 k8s.gcr.io/etcd:3.4.13-0 k8s.gcr.io/coredns:1.7.0 # ====================================================================================
- 解决国外镜像不能访问的问题
# 创建kubeadm.sh脚本,用于拉取镜像/打tag/删除原有镜像
vi kubeadm.sh
# ====================================================================================
#!/bin/bash
set -e
KUBE_VERSION=v1.20.0
KUBE_PAUSE_VERSION=3.2
ETCD_VERSION=3.4.13-0
CORE_DNS_VERSION=1.7.0
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 【查看镜像】
初始化master节点
- 初始化master节点
kubeadm reset 【初始化集群状态】 kubeadm init --kubernetes-version=1.20.0 \ --apiserver-advertise-address=192.168.1.51 \ --pod-network-cidr=10.244.0.0/16 【初始化master节点】 # 注意:记得保存好最后kubeadm join的信息。 # ======================================================================================= Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.1.51:6443 --token fag134.3wot9edrvs82vh6d \ --discovery-token-ca-cert-hash sha256:1df02a06552c02ba0e28e00c80a50e9ff40da81a4cdd53c136a16d3c0233f450
- 根据日志提示执行
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 查看pod。我这里由于是在4核16G的win10上搭建了三台2核2G的centos,所以,我等了一晚上coredns的状态才变为running
等待一会儿,同时可以发现像etcd,controller,scheduler等组件都以pod的方式安装成功了 # 注意:coredns没有启动,需要安装网络插件 kubectl get pods -n kube-system 【查看kube-system的pods】 kubectl get pods --all-namespaces 【查看所有pods】 # ======================================================================================= NAME READY STATUS RESTARTS AGE coredns-fb8b8dccf-f7g6g 0/1 Pending 0 7m30s coredns-fb8b8dccf-hx765 0/1 Pending 0 7m30s etcd-m 1/1 Running 0 6m30s kube-apiserver-m 1/1 Running 0 6m36s kube-controller-manager-m 1/1 Running 0 6m42s kube-proxy-w9m72 1/1 Running 0 7m30s kube-scheduler-m 1/1 Running 0 6m24s
- 健康检查
curl -k https://localhost:6443/healthz
部署calico网络插件
- 在k8s中安装calico
kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml
- 确认一下calico是否安装成功,在这里,我等了一晚上。。。。配置太差
kubectl get pods --all-namespaces -w
kube join
将之前的kube join(自己的)在woker01和worker02上执行上述命令
kubeadm join 192.168.1.51:6443 --token fag134.3wot9edrvs82vh6d \
--discovery-token-ca-cert-hash sha256:1df02a06552c02ba0e28e00c80a50e9ff40da81a4cdd53c136a16d3c0233f450
在master节点上检查集群信息 ,在这里我也等待了很长时间
kubectl get nodes
自此,K8S集群已搭建完成
更多推荐
所有评论(0)