从零搭建Kubernetes集群

一、搭建虚拟机

在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

 

网页访问:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值