一、K8S架构
1、API Server :用于暴露Kubernetes API,任何资源的请求的调用操作都是通过kube-apiserver提供的接口进行的。
2、Etcd:是Kubernetes提供默认的存储系统,保存所有集群数据,使用时需要为etcd数据提供备份计划。
3、Controller-Manager:作为集群内部的管理控制中心,负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。
4、Scheduler:监视新创建没有分配到Node的Pod,为Pod选择一个Node。
5、Kubelet:负责维护容器的生命周期,同时负责Volume和网络的管理。
6、Kube proxy:是Kubernetes的核心组件,部署在每个Node节点上,它是实现Kubernetes Service的通信与负载均衡机制的重要组件。
安装环境说明
k8s集群:192.168.168.128-130;
k8s集群:192.168.168.100-102;
我安装了两次,所以Ip有两套。
主机名称 | IP地址 | 需要安装的软件 |
---|---|---|
k8s-master | 192.168.168.128/100 | kube-apiserver、kube-controller-manager、kube-scheduler、docker、etcd、calico,NFS |
k8s-node1 | 192.168.168.129/101 | kubelet、kubeproxy、Docker18.06.1-ce |
k8s-node2 | 192.168.168.130/102 | kubelet、kubeproxy、Docker18.06.1-ce |
安装K8S前提
先安装好Docker:
https://blog.csdn.net/qq_41822345/article/details/107123094
二、三台机器的通用安装
注:本安装为 非高可用版 k8s安装,简易版安装步骤,用于k8s的入门学习
1.环境准备
1.修改三台机器的hostname
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
2.修改hosts
cat >>/etc/hosts<<EOF
192.168.168.128 k8s-master
192.168.168.129 k8s-node1
192.168.168.130 k8s-node2
EOF
3.关闭防火墙和关闭SELinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0 # 临时关闭
vi /etc/sysconfig/selinux #永久关闭
# 改为SELINUX=disabled
4.设置允许路由转发,不对bridge的数据进行处理,先创建文件
vi /etc/sysctl.d/k8s.conf
内容如下:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
执行文件
sysctl -p /etc/sysctl.d/k8s.conf
5.kube-proxy 开启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
6.所有节点关闭swap
swapoff -a #临时关闭
vi /etc/fstab #永久关闭
#注释掉以下字段
/dev/mapper/cl-swap swap swap defaults 0 0
2.安装kubelet、kubeadm、kubectl
- kubeadm: 用来初始化集群的指令。
- kubelet: 在集群中的每个节点上用来启动 pod 和 container 等。
- kubectl: 用来与集群通信的命令行工具。
1.清空yum缓存
yum clean all
2.设置 yum安装源
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=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装
yum install -y kubelet kubeadm kubectl
kubelet 设置开机启动(注意:先不启动,现在启动的话会报错)
systemctl enable kubelet
(关闭systemctl disable kubelet)
查看版本
kubelet --version
安装的是最新版本: Kubernetes v1.19.1(可能会变化)
三、Master节点安装
1.运行初始化命令
kubeadm init --kubernetes-version=1.19.1 \
--apiserver-advertise-address=192.168.168.128 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
注意:
kubernetes-version的值 即为 kubelet --version获得的值
apiserver-advertise-address这个地址必须是master机器的IP
常用错误:
- 错误一:[WARNING IsDockerSystemdCheck]: detected “cgroupfs” as the Docker cgroup driver作为Docker cgroup驱动程序。,Kubernetes推荐的Docker驱动程序是“systemd”
解决方案:修改Docker的配置,如下:
vi /etc/docker/daemon.json
# 加入:
{
"exec-opts":["native.cgroupdriver=systemd"]
}
- 错误二:下载k8s的某些容器镜像组件失败。
解决方案:docker.io仓库对这些容器做了镜像,可以通过下列命令下拉取相关镜像:
docker pull coredns/coredns:1.8.0
docker tag docker.io/coredns/coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR ImagePull]: failed to pull image registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0: output: Error response from daemon: manifest for registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0 not found
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
[root@k8s-node1 ~]# docker pull coredns/coredns:1.8.0 #
1.8.0: Pulling from coredns/coredns
c6568d217a00: Already exists
5984b6d55edf: Pull complete
Digest: sha256:cc8fb77bc2a0541949d1d9320a641b82fd392b0d3d8145469ca4709ae769980e
Status: Downloaded newer image for coredns/coredns:1.8.0
docker.io/coredns/coredns:1.8.0
[root@k8s-node1 ~]# docker tag docker.io/coredns/coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
- 错误三:[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
解决方案:修改虚拟机的CPU的个数,至少为2个。重新装linux。
成功安装过程日志:
最后,会提示节点安装的命令,必须记下来:
kubeadm join 192.168.168.128:6443 --token r6f77w.hyzai8ko7tlmqmzp \
--discovery-token-ca-cert-hash sha256:def116c287e8881b57bd6ec496d2147a57e661e600abb99169f53158639dbcc1
2.启动kubelet
systemctl restart kubelet
systemctl status kubelet
3.配置kubectl工具
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.安装Calico
mkdir k8s
cd k8s
wget https://docs.projectcalico.org/v3.10/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml
sed -i 's/192.168.0.0/10.244.0.0/g' calico.yaml
kubectl apply -f calico.yaml
5.等待几分钟,查看所有Pod的状态,确保所有Pod都是Running状态
kubectl get pod --all-namespaces -o wide
四、slave节点安装
前提:
master节点:要保证master节点是启动的 → systemctl status kubelet
slave节点:要先安装好docker(docker安装https://blog.csdn.net/qq_41822345/article/details/107123094)
1.让所有节点加入集群环境(使用之前Master节点产生的命令加入集群)
kubeadm join 192.168.168.128:6443 --token r6f77w.hyzai8ko7tlmqmzp \
--discovery-token-ca-cert-hash sha256:def116c287e8881b57bd6ec496d2147a57e661e600abb99169f53158639dbcc1
这里加入节点的命令因为时效性有可能会失效,重新生成即可方法如下:
#重新生成
[root@k8s-master ~]# kubeadm token create
ntqpnh.f5tbwenab50233at
#查看其TTL
[root@k8s-master ~]# kubeadm token list
TOKEN TTL EXPIRES USAGES ntqpnh.f5tbwenab50233at 23h 2020-01-08T19:27:01+08:00 a<none> #生成sha256
[root@k8s-master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
#node节点重新加入
[root@k8s-node-1 ~]# kubeadm join 192.168.168.128:6443 --token ntqpnh.f5tbwenab50233at --discovery-token-ca-cert-hash sha256:ccda864cd48283781798aba6aefbd929b6c52124bd3f71c62e38914d02dce0e8
2.启动kubelet
systemctl start kubelet
3.回到Master节点查看,如果Status全部为Ready,代表集群环境搭建成功!!!
kubectl get nodes
安装完成!!!!!!
五、nodes从节点运行kubectl
1、拷贝master节点/usr/bin/kubectl到node节点;
scp /usr/bin/kubectl root@192.168.168.101:/usr/bin/
2、拷贝master节点/apps/conf/kubernetes/admin.conf 到node节点;
scp /etc/kubernetes/admin.conf root@192.168.168.101:/etc/kubernetes/
3、在node节点设置环境变量:
vim /etc/profile
在文件最后添加如下配置:
# k8s kubectl 配置
export KUBECONFIG=/etc/kubernetes/admin.conf
保存退出,执行 source /etc/profile,配置立即生效。
4、检验配置是否成功。
[root@k8s-node1 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 30m v1.21.0
k8s-node1 Ready <none> 26m v1.21.0
k8s-node2 Ready <none> 22m v1.21.0