一、搭建虚拟机
在VMvare中搭建好基于centos7的虚拟机三个节点,原则上配置不低于2核、2G内存、20G磁盘
配置好免密
step1、分别在三台机器上执行:
ssh-keygen -t rsa
一路回车
step2、在node1上:
cd ~/.ssh
scp id_rsa.pub root@node2:/opt
scp id_rsa.pub root@node3:/opt
cd ~/.ssh
在node2上:cat /opt/id_rsa.pub >> authorized_keys
在node3上:cat /opt/id_rsa.pub >> authorized_keys
此时node1上可以ssh到node2、node3
step3、在node2上:
cd ~/.ssh
scp id_rsa.pub root@node1:/opt
scp id_rsa.pub root@node3:/opt
cd ~/.ssh
在node1上:cat /opt/id_rsa.pub >> authorized_keys
在node3上:cat /opt/id_rsa.pub >> authorized_keys
此时node2上可以ssh到node1、node3
step4、在node3上:
cd ~/.ssh
scp id_rsa.pub root@node1:/opt
scp id_rsa.pub root@node2:/opt
cd ~/.ssh
在node1上:cat /opt/id_rsa.pub >> authorized_keys
在node2上:cat /opt/id_rsa.pub >> authorized_keys
此时node3上可以ssh到node1、node2
关闭防火墙
防火墙一定要提前关闭,否则在后续安装K8S集群的时候是个trouble maker。执行下面语句关闭,并禁用开机启动
每台机器执行:
systemctl stop firewalld & systemctl disable firewalld
关闭swap
在安装K8S集群时,Linux的Swap内存交换机制是一定要关闭的,否则会因为内存交换而影响性能以及稳定性。这里,我们可以提前进行设置
执行
swapoff -a
可临时关闭,但系统重启后恢复编辑
/etc/fstab
,注释掉包含swap
的那一行即可,重启后可永久关闭直接执行:
sed -i '/ swap / s/^/#/' /etc/fstab
关闭图形界面
CentOS 7 安装好后,登录时默认启用了很占资源的图形界面,若启动三个虚拟机更会卡的飞起。因此,我们可以通过如下命令切换默认的登录方式:
命令模式
systemctl set-default multi-user.target
图形模式
systemctl set-default graphical.target
这里,强烈建议切换为命令模式,所有的操作都通过Xshell进行足以。注意,上面的命令执行后重启生效
配置yum源
建议使用CentOS 7 自带的yum源,因为安装软件和依赖时会非常慢甚至超时失败。这里,我们使用阿里云的源予以替换,执行如下命令,替换文件/etc/yum.repos.d/CentOS-Base.repo
:
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache
报错:[Errno 14] curl#7 - "Failed connect to mirrors.aliyuncs.com:80; Connection refused
处理:
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
然后
yum makecache
关闭selinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
二、安装docker
添加仓库
添加阿里云的Docker仓库:(如果虚拟机不能够连互联网可尝试自己搭建Docker私服)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache
安装docker
执行以下命令,安装最新版Docker:
yum install docker-ce -y
docker --version
查看版本信息
启动docker
启动Docker服务并激活开机启动:
systemctl start docker & systemctl enable docker
运行一条命令验证一下:
docker run hello-world
离线一键安装包(执行install.sh一键安装):
链接:https://pan.baidu.com/s/1jlfmcNWNsvmkjig3dZNx5Q
提取码:qbb7
三、搭建K8S集群
配置k8s yum源
执行以下命令添加kubernetes.repo仓库
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
安装相关组件
执行以下命令安装kubelet、kubeadm、kubectl:
yum install -y kubelet kubeadm kubectl
配置kubelet的cgroup drive
确保docker 的cgroup drive 和kubelet的cgroup drive一样:
docker info | grep -i cgroup
cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
若显示不一样,则执行:
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
systemctl daemon-reload
这是网上博主V1.10.0版本的配置。
此处我yum安装后目录文件是:
/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
没看到cgroup参数
vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
启动kubelet
根据官方文档描述,安装kubelet、kubeadm、kubectl三者后,要求启动kubelet:
systemctl enable kubelet && systemctl start kubelet
但实际测试发现,无法启动,报如下错误:
查看日志发现是没有证书:
unable to load client CA file /etc/kubernetes/pki/ca.crt: open /etc/kubernetes/pki/ca.crt: no such file or directory
网上没有找到解决方法,但无意测试中发现,后面的kubeadm init
操作会创建证书。也就是说,现在无法启动并不影响后续操作,继续!
下载k8s的docker镜像
执行查看镜像列表:
kubeadm config images list
提示不能访问官方地址。
从阿里云镜像仓库下载:
docker image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.2
docker image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.2
docker image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.2
docker image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.2
docker image pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1
docker image pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0
docker image pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.8.0
查看已下载的镜像:
对镜像打tag,更名为kubeadm默认去找的镜像名:
docker image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.2 k8s.gcr.io/kube-apiserver:v1.21.2
docker image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.2 k8s.gcr.io/kube-controller-manager:v1.21.2
docker image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.2 k8s.gcr.io/kube-scheduler:v1.21.2
docker image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.2 k8s.gcr.io/kube-proxy:v1.21.2
docker image tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1 k8s.gcr.io/pause:3.4.1
docker image tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0 k8s.gcr.io/etcd:3.4.13-0
docker image tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.8.0 k8s.gcr.io/coredns/coredns:v1.8.0
删除之前下载的镜像:
docker image rm -f registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.2
docker image rm -f registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.2
docker image rm -f registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.2
docker image rm -f registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.2
docker image rm -f registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1
docker image rm -f registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0
docker image rm -f registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.8.0
创建集群
在Master主节点(node1)上执行:
kubeadm init --pod-network-cidr=192.168.0.0/16 --kubernetes-version=v1.21.2 --apiserver-advertise-address=192.168.143.128
含义:
1.选项--pod-network-cidr=192.168.0.0/16 这里需要提前指定Calico的子网范围
2.选项--kubernetes-version=v1.21.2指定K8S版本,这里必须与之前导入到Docker镜像版本v1.21.2一致,否则会访问谷歌去重新下载K8S最新版的Docker镜像
3.选项--apiserver-advertise-address表示绑定的网卡IP,这里一定要绑定前面提到的enp0s8网卡,否则会默认使用enp0s3网卡
4.若执行kubeadm init出错或强制终止,则再需要执行该命令时,需要先执行kubeadm reset重置
执行报错:
大致包含:cgroup要和docker cgroup drive配置一致警告、最少2核cpu、关闭swap等错误
重启后还有报错:
执行脚本(node2、node3也执行一下):
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
继续执行:kubeadm init --pod-network-cidr=192.168.0.0/16 --kubernetes-version=v1.21.2 --apiserver-advertise-address=192.168.143.128
可以看到,提示集群成功初始化,并且我们需要执行以下命令(root用户无需sudo):
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
是root用户,继续执行:
export KUBECONFIG=/etc/kubernetes/admin.conf
另外, 提示我们还需要创建网络,并且让其他节点执行kubeadm join...
加入集群
先加入其它节点,分别在node2、node3上执行:
kubeadm join 192.168.143.128:6443 --token 4j1m8e.ytxg4er68l0an7ai \
--discovery-token-ca-cert-hash sha256:8fc56758291c9fba7ce459730a40fc2c8e146a145f41af4924bdcfbd5e70ca0e
创建网络
如果不创建网络,查看pod状态时,可以看到kube-dns组件是阻塞状态,集群是不可用的
kubectl get pod -n kube-system
可以参考官方文档(Installing Addons | Kubernetes),根据需求选择适合的网络,这里,我们使用kube-flannel
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
再执行:kubectl get pod -n kube-system
全部Running则表示集群正常
执行:kubectl get node
相关操作测试
命令行测试创建deployment
kubectl create deployment nginx --image=nginx
在其他节点上docker ps查看:
k8s使用deployment 正式部署nginx
为了实现在Kubernetes集群上部署容器化应用程序。需要创建一个Kubernetes Deployment,Deployment负责创建和更新应用。创建Deployment后,Kubernetes master 会将Deployment创建好的应用实例调度到集群中的各个节点
1、编写deployment文件:
最好参考官方的参数:Deployments | Kubernetes
vim nginx-deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 1
selector:
matchLabels:
app: nginx-cluster
template:
metadata:
labels:
app: nginx-cluster
spec:
containers:
- name: nginx-cluster
image: nginx
ports:
- containerPort: 80
resources:
requests:
cpu: 1
memory: 500Mi
limits:
cpu: 2
memory: 1024Mi
2、创建 deployment
kubectl create -f nginx-deploy.yml #创建deployment
kubectl get deployment #查看deployment
kubectl get pod -o wide #查看pod状态
3、发布service
Pod是有生命周期的。当一个工作节点(Node)销毁时,节点上运行的Pod也会销毁,然后通过ReplicationController动态创建新的Pods来保持应用的运行。作为另一个例子,考虑一个图片处理 backend,它运行了3个副本,这些副本是可互换的 —— 前端不需要关心它们调用了哪个 backend 副本。也就是说,Kubernetes集群中的每个Pod都有一个独立的IP地址,甚至是同一个节点上的Pod,因此需要有一种方式来自动协调各个Pod之间的变化,以便应用能够持续运行
Enter Services。Kubernetes中的Service 是一个抽象的概念,它定义了Pod的逻辑分组和一种可以访问它们的策略,这组Pod能被Service访问,使用YAML (优先)或JSON 来定义Service,Service所针对的一组Pod通常由LabelSelector实现
可以通过type在ServiceSpec中指定一个需要的类型的 Service,Service的四种type:
ClusterIP(默认) - 在集群中内部IP上暴露服务。此类型使Service只能从群集中访问。
NodePort - 通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。通过请求 <NodeIP>:<NodePort>,可以从集群的外部访问一个 NodePort 服务。
LoadBalancer - 使用云提供商的负载均衡器(如果支持),可以向外部暴露服务。外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务。
ExternalName - 通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容,没有任何类型代理被创建。这种类型需要v1.7版本或更高版本kube-dnsc才支持
vim nginx-service.yml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx-service
spec:
type: NodePort
selector:
app: nginx-cluster
ports:
- port: 80
nodePort: 32500
创建服务:
kubectl create -f nginx-service.yml #创建service
kubectl get svc #查看service
网页访问: