Kubernetes是Google 2014年创建管理的,是Google 10多年大规模容器管理技术Borg的开源版本。它是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
Master
k8s集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求。
Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 数据库)和 Controller MangerServer 所组成。
Nodes
集群工作节点,运行用户业务应用容器。
Nodes节点也叫Worker Node,包含kubelet、kube proxy 和 Pod(Container Runtime)。
部署 Kubernetes 环境(集群)主要有多种方式:
(1)minikube
minikube可以在本地运行Kubernetes的工具,minikube可以在个人计算机(包括Windows,macOS和Linux PC)上运行一个单节点Kubernetes集群,以便您可以试用Kubernetes或进行日常开发工作;
https://kubernetes.io/docs/tutorials/hello-minikube/
(2)kind
Kind和minikube类似的工具,让你在本地计算机上运行Kubernetes,此工具需要安装并配置Docker;
https://kind.sigs.k8s.io/
(3)kubeadm
Kubeadm是一个K8s部署工具,提供kubeadm init 和 kubeadm join两个操作命令,可以快速部署一个Kubernetes集群;
官方地址:
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
(4)二进制包
从Github下载发行版的二进制包,手动部署安装每个组件,组成Kubernetes集群,步骤比较繁琐,但是能让你对各个组件有更清晰的认识;
(5)yum安装
通过yum安装Kubernetes的每个组件,组成Kubernetes集群,不过yum源里面的k8s版本已经比较老了,所以这种方式用得也比较少了;
(6)第三方工具
有一些大神封装了一些工具,利用这些工具进行k8s环境的安装;
(7)花钱购买
直接购买类似阿里云这样的公有云平台k8s,一键搞定;
kubeadm是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes集群的部署。
创建一个Master节点:
kubeadm init
将Node节点加入到Master集群中:
kubeadm join
这里我准备了三台机器
ip: 192.168.44.135 主机名:k8s-master-135 系统:centos8 配置:2核2G
ip: 192.168.44.133 主机名:k8s-node-133 系统:centos8 配置:2核2G
ip: 192.168.44.134 主机名:test-node-134 系统:centos8 配置:2核2G
三台主机都需要执行如下命令:
关闭防火墙和selinux
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
关闭swap分区(k8s禁止虚拟内存以提高性能)
swapoff -a # 临时关闭
vim /etc/fstab # 注释到swap那一行 永久关闭
添加主机名与IP对应关系(三台主机都执行)
echo '''
192.168.44.135 k8s-master-135
192.168.44.133 k8s-node-133
192.168.44.134 k8s-node-134
''' >> /etc/hosts
各自修改主机名(从176-178各自顺序执行)
hostnamectl set-hostname k8s-master-135
hostnamectl set-hostname k8s-node-133
hostnamectl set-hostname k8s-node-134
将桥接的IPv4流量传递到iptables的链(三台主机都执行):
以下net.ipv4.ip_forward如存在=0,修改为1即可
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.ipv4.tcp_tw_recycle = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
时间同步
#启动chronyd服务
systemctl start chronyd
systemctl enable chronyd
date
Tips:执行命令前 可以 使用 rpm -qa |grep chrony 查看系统是否已安装chrony,没有安装环境可使用 yum
install chrony 命令安装
1)Docker安装
卸载旧版本
Docker的旧版本被称为Docker或Docker引擎。如果安装了这些,请卸载它们以及相关的依赖项。
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
如果 yum 报告未安装这些软件包,则可以。
更换镜像
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo #进入yum目录
cd /etc/yum.repos.d
# 删除目录下所有文件(注意完整复制,不要漏了那个点)
rm -rf ./*
# 安装正确的镜像源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
# 生成缓存
yum makecache
安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
设置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
可以查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r
安装docker
yum install -y docker-ce-3:20.10.9-3.el8
如果有问题,参考这里解决:
Centos 8安装Docker及报错解决办法_duansamve的博客-CSDN博客_centos8 docker 安装失败
启动并加入开机启动
systemctl start docker
systemctl enable docker
验证docker是安装成功
docker version
docker info
配置镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ccdkz6eh.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2)安装kubeadm,kubelet和kubectl
添加k8s阿里云YUM软件源
所有机器执行
cat < /etc/yum.repos.d/kubernetes.repo
[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
#清除缓存
yum clean all
#把服务器的包信息下载到本地电脑缓存起来,makecache建立一个缓存
yum makecache
#列出kubectl可用的版本
yum list kubectl --showduplicates | sort -r
安装kubeadm,kubelet和kubectl
所有机器执行
yum install -y kubelet-1.21.0 kubeadm-1.21.0 kubectl-1.21.0
systemctl start kubelet
systemctl enable kubelet
查看有没有安装
yum list installed | grep kubelet
yum list installed | grep kubeadm
yum list installed | grep kubectl
查看安装的版本: kubelet --version
Kubelet:运行在cluster所有节点上,负责启动POD和容器;
Kubeadm:用于初始化cluster的一个工具;
Kubectl:kubectl是kubenetes命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件;
此时应该重启一下centos
reboot
1)部署master节点,在192.168.44.135执行
初始化master节点
kubeadm init --apiserver-advertise-address=192.168.44.135 \
--apiserver-cert-extra-sans=127.0.0.1 \
--image-repository=registry.aliyuncs.com/google_containers \
--ignore-preflight-errors=all \
--kubernetes-version=v1.21.0 \
--service-cidr=10.10.0.0/16 \
--pod-network-cidr=10.18.0.0/16
参数说明
--apiserver-advertise-address=192.168.44.135:这个参数就是master主机的IP地址,例如我的Master主机的IP是:192.168.44.135
--image-repository=registry.aliyuncs.com/google_containers:这个是镜像地址,由于国外地址无法访问,故使用的阿里云仓库地址:registry.aliyuncs.com/google_containers
--kubernetes-version=v1.17.4:这个参数是下载的k8s软件版本号
--service-cidr=10.96.0.0/12:这个参数后的IP地址直接就套用10.96.0.0/12 ,以后安装时也套用即可,不要更改
--pod-network-cidr=10.244.0.0/16:k8s内部的pod节点之间网络可以使用的IP段,不能和service-cidr写一样,如果不知道怎么配,就先用这个10.244.0.0/16
网段问题,两个网段不要重,后面是/16,不要与当前机器网段一样。
如果报错:
原因分析:
之前我的Docker是用yum安装的,docker的cgroup驱动程序默认设置为system。默认情况下Kubernetes cgroup为systemd,我们需要更改Docker cgroup驱动。
解决方法:
vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
# 重启docker
systemctl restart docker
# 重新初始化
kubeadm reset # 先重置
#重复上次【初始化master节点】的命令
初始化master节点成功后会返回如下提示:
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
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
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.44.135:6443 --token pv0w8v.cit7bb03f5gb083x \
--discovery-token-ca-cert-hash sha256:fc10d7dd98e4ac9d6fae019c98dd4a247b88d3a9bc72510ab2f3ecd3383848a0
其中有生成一串命令用于node节点的加入,记录下来,接着执行以下命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
2)部署node节点,在192.168.44.133和192.168.44.134执行
这里复制上面生成的一串命令,我这里只是示例,命令根据你实际生成的复制去node节点执行
kubeadm join 192.168.44.135:6443 --token pv0w8v.cit7bb03f5gb083x \
--discovery-token-ca-cert-hash sha256:fc10d7dd98e4ac9d6fae019c98dd4a247b88d3a9bc72510ab2f3ecd3383848a0
3)验证
node节点上执行
kubectl get nodes
master节点192.168.44.135上执行
kubectl get nodes
下面两种插件二选一,master上执行,如果是云服务器建议按照flannel,calico可能会和云网络环境有冲突。
1)安装flannel插件(轻量级用于快速搭建使用,初学推荐)
2)安装calico插件(master节点上执行,用于复杂网络环境)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
如果安装失败,看Calico版本是否与Kubernetes版本匹配:
System requirements
然后查看节点状态:
kubectl get nodes #在master机器上执行
说明还没有就绪,需要等一会儿,然后节点就就绪了。
至此我们的k8s环境就搭建好了 。
在Kubernetes集群中创建一个pod,验证是否正常运行
创建一个pod,开放对外端口访问,这里会随机映射一个端口
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
查看pod状态,必须是running状态而且ready是1,并查看nginx svc的80端口映射到了哪个端口
kubectl get pod,svc
访问任意机器的刚刚查看的映射端口,看看是否nginx已经运行。
查看运行时容器pod (一个pod里面运行了多个docker容器)
kubectl get pods -n kube-system
查看pod,service,endpoints,secret等等的状态
kubectl get 组件名 #例如kubectl get pod 查看详细信息可以加上-o wide 其他namespace的指定 -n namespace名
创建,变更一个yaml文件内资源,也可以是目录,目录内包含一组yaml文件(实际使用中都是以yaml文件为主,直接使用命令创建pod的很少,推荐多使用yaml文件)
kubectl apply -f xxx.yaml #例如kubectl apply -f nginx.yaml #这里是如果没有则创建,如果有则变更,比create好用
删除一个yaml文件内资源,也可以是目录,目录内包含一组yaml文件
kubectl delete -f xxx.yaml #例如kubectl delete -f nginx.yaml
查看资源状态,比如有一组deployment内的pod没起来,一般用于pod调度过程出现的问题排查
kubectl describe pod pod名 #先用kubectl get pod查看 #有异常的复制pod名使用这个命令
查看pod日志,用于pod状态未就绪的故障排查
kubectl logs pod名 # 先用kubectl get pod查看 #有异常的复制pod名使用这个命令
查看node节点或者是pod资源(cpu,内存资源)使用情况
kubectl top 组件名 #例如kubectl top node kubectl top pod
进入pod内部
kubectl exec -it pod名 /bin/bash #先用kubectl get pod查看 #有需要的复制pod名使用这个命令