入门式了解容器-k8s(云服务器安装)

一、K8S简介

Kubernetes(简称k8s)是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了资源调度、部署管理、服务发现、扩容缩容、监控,维护等一整套功能。努力成为跨主机集群的自动部署、扩展以及运行应用程序容器的平台。 它支持一系列容器工具, 包括Docker等。

kubernetes的特点:
可移植:支持公有云,私有云,混合云,多重云(multi-cloud)

可扩展::模块化, 插件化, 可挂载, 可组合

自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展,自我修复

服务发现和负载均衡

二、k8s架构和组件

Kubernetes主要由以下核心组件组成:

  • etcd保存了整个集群的状态,配置数据以及有关集群状态的信息位于 etcd(一个键值存储数据库)中。etcd 采用分布式、容错设计,被视为集群的最终事实来源。
  • kube-apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
  • kube-controller-manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
  • kube-scheduler负责资源的调度,接收ApiServer创建Pod的请求,为Pod选择一个合适的Node,由该Node上的kubelet启动Pod中的相应容器
  • kubelet负责本Node节点上的Pod的创建、修改、监控、删除等生命周期管理,同时Kubelet定时“上报”本Node的状态信息到Api Server里
  • kube-proxy负责为Service提供cluster内部的服务发现负载均衡

处理流程

1、用户请求:通过kubectl命令行工具或API接口提交一个Pod的定义,通常是通过YAML或JSON格式的配置文件来描述Pod的详细信息,包括容器镜像、环境变量、资源需求、卷挂载等。

2、kube-apiserver接收:请求首先到达Kubernetes的kube-apiserver,kube-apiserver会对请求进行认证、授权和准入控制检查。

3、持久化存储到etcd:kube-apiserver验证了请求的有效性,它会将Pod的定义信息写入etcd(分布式键值存储),以确保集群内的所有组件都能获取最新的集群状态

4、kube-scheduler调度决策:当Pod被创建并保存到etcd后,kube-apiserver会触发调度器(scheduler)对Pod进行调度,调度器根据集群节点的资源状况、亲和性和反亲和性规则以及其他约束条件,选择一个最适合运行Pod的Node

5、绑定Pod到Node:kube-scheduler将调度决定通知给kube-apiserver,由kube-apiserver将Pod与选定的Node进行绑定

6、kubelet执行:绑定的节点上的kubelet进程通过监听kube-apiserver的事件,得知需要在其上创建新的Pod,那么kubelet从etcd中获取该Pod的详细信息,然后开始执行创建Pod的具体工作,例如下载容器镜像,创建网络命名空间和网络策略,设置数据卷以及启动pod的容器

7、pod的就绪和运行:当pod内的所有容器都成功的启动并通过了就绪探针的检测,那么kubelet会将pod的状态汇报到kube-apiserver,标记pod的状态为“running”状态,那么此时pod就可以接收来自service的流量

8、持续监控和管理:在pod的生命周期内,kubelet和kube-apiserver会持续监测pod的状态,并根据pod的定义和系统策略进行对应的管理和维护操作

三、k8s搭建

搭建一个简单的一主两从的k8s小集群:

1、环境规划

版本说明
软件版本
操作系统CentOS-7-x86 
Docker 26.1.4
Kubernetes1.23.0 
集群规划
HostnameIP规格安装组件
k8s-master47.238.72.60 2C4Gkubelet
kube-apiserver
kube-controller-manager
kube-schedule
kube-proxy 
k8s-node147.238.65.218 2C2Gkubelet
kube-proxy
k8s-node247.238.78.15 2C2G kubelet
kube-proxy

下述操作所有节点均需执行!!

2、修改服务器hostname

①hostnamectl set-hostname xxx(定义的主机名)

②执行:bash  生效

3、修改hosts (简化配置,确保各节点(包括 master 节点和 worker 节点)之间能够通过网络相互通信)

cat >> /etc/hosts << EOF
xxxxxx k8s-master
xxxxxx k8s-node1
xxxxxx k8s-node2
EOF

例如:

47.238.72.60 k8s-master
47.238.65.218 k8s-node1
47.238.78.15 k8s-node2

4、关闭swap分区(Kubernetes 使用 kubelet 来管理节点上的资源,Swap 可能导致节点内存使用情况变得不可预测,因为操作系统可以将内存页交换到磁盘上,影响性能和应用程序的响应时间)

swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab

5、关闭防火墙(防火墙可能阻止 Kubernetes 集群节点之间所需的网络流量,例如 API server 的流量、网络插件的流量)

systemctl stop firewalld && systemctl disable firewalld

6、关闭SELinux (SELinux提供了强制访问控制,但它可能与 Kubernetes 的某些操作和容器化应用不兼容,导致权限问题或功能受限)

setenforce 0 && sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

7、开启 ipvs(启用 IPVS 可以提高 Kubernetes Service 的网络性能,提供更高的吞吐量和更低的延迟)

①yum -y install ipset ipvsadm

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 (避免权限问题)

8、统一时区

①yum install -y ntpdate

②ntpdate time.windows.com

9、部署docker容器

  yum -y update
  yum install -y yum-utils device-mapper-persistent-data lvm2
  yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  yum -y install docker-ce

启动容器:systemctl start docker && systemctl enable docker

10、创建并配置镜像下载加速器

cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://wrx01hg3.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

systemctl daemon-reload
systemctl restart docker

11、安装阿里云的 YUM 软件源

cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=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

12、安装 kubeadm, kubelet 和 kubectl

yum update -y
yum install -y kubelet-xxx kubeadm-xxx kubectl-xxx(版本可根据需求选择)

systemctl enable kubelet
systemctl start kubelet

版本信息:https://v1-30.docs.kubernetes.io/zh-cn/docs/concepts/overview/components/

四、k8s初始化和网络插件

在master节点上操作:

1、集群初始化(红色需要变更为实际服务器的配置):

kubeadm init \
  --apiserver-advertise-address=xxxx \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.23.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16

--apiserver-advertise-address=xxxx:

指定 Kubernetes API 服务器应该广告的 IP 地址。这个地址通常是 master 节点的 IP 地址(但是在验证过程中,需要修改为master的私有地址,即需要查看机器的网卡绑定的IP)。其他节点将通过这个地址与 API 服务器通信。
--image-repository=registry.aliyuncs.com/google_containers:

指定一个替代的镜像仓库地址。由于中国大陆的网络原因,直接访问 Google 的镜像仓库可能很慢或无法访问,因此很多用户选择使用国内的镜像,比如阿里云的仓库,以加速镜像下载。
--kubernetes-version=v1.23.0:

指定要安装的 Kubernetes 的版本。这个选项确保你安装的是指定的版本。这在你需要特定版本功能或与其他软件兼容时尤其有用。
--service-cidr=10.96.0.0/12:

定义 Kubernetes 内部虚拟网络中的服务 IP 地址范围。这个网段中的 IP 地址用于分配给 Kubernetes 服务。
--pod-network-cidr=10.244.0.0/16:

指定 Pod 网络的 IP 地址范围。这个 IP 网段用于分配给在集群中运行的 Pod。通常需要与所使用的网络插件(如 Flannel、Calico)的配置相匹配。比如,Flannel 的默认配置通常使用 10.244.0.0/16。

例如:

kubeadm init \
  --apiserver-advertise-address=172.17.163.133 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.23.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16

节点上执行后,此时节点加入集群中:

(在实际安装中,有可能会出现docker的网桥划分不对,导致节点一直无法加入集群,此时需要修改/etc/hosts的配置文件)

加入后的情况,此时容器内的网络通信并不通

2、安装网络插件Flannel

PS:主要作用是在集群中的各个节点之间提供一个扁平的、互相连通的网络环境,使得运行在不同节点上的容器可以通过 IP 地址直接进行通信

wget https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml获取flannel的yaml文件

kubectl apply -f kube-flannel.yml

等待几分钟后,全部变成ready,此时k8s算是搭建完成

五、K8s创建微服务

简单的创建一个nginx的服务器为例:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: nginx-test
  labels:
    app: nginx-pod
spec:
  restartPolicy: Always
  containers:
    - name: nginx-web
      image: nginx:latest
      ports:
        - containerPort: 80
          protocol: TCP
      imagePullPolicy: Always
      resources:
        requests:
           cpu: 0.1
           memory: 100Mi
        limits:
           cpu: 0.1
           memory: 100Mi

执行如上资源清单,会创建对应的pod

kubectl apply -f nginx-pod.yaml

kubectl get pods -n nginx-test -owide

2、使用service的nodeport方式将端口暴漏给外部访问(集群内的网络,外部是无法访问的)

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: nginx-test
spec:
  selector:
     app: nginx-pod
  ports:
   - port: 80
     targetPort: 80
     protocol: TCP
  type: NodePort

执行如上资源清单,会创建对应的svc以及可以看到svc通过nodeport暴漏出去的外部访问端口

kubectl apply -f service.yaml

kubectl get svc -n nginx-test -owide

上述服务都完成后,就可以通过公网ip+端口进行访问

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值