Kubernetes介绍及快速部署<一>

K8S


1.Kubernetes概述

k8s官网

kubernetes又称k8s,8代表ubernete,谷歌在2014年开业的轻便可扩展的一个开源平台,用于管理云平台的容器化应用和服务,利用kubernetes进行应用扩展,k8s目标的实施让部署容器化应用更加简洁高效


2.K8s特性
  • 自动装箱

基于容器对应用的资源配置自动部署

  • 自我修复

当容器挂了,会对容器进行重启,当部署的节点有问题时,则会重新部署和调度

当容器没有通过监控配置时,会关闭容器,当能正常开启的时候才会对外提供服务

  • 水平扩展

通过命令配置使应用容器进行规模扩大或裁剪,让资源(cpu,内存等)能够合理的分配

  • 服务发现

用户不需要知道服务内部发现的机制,采取对外提供统一的路口,基于K8s自身的实现服务和负载均衡 (比如有俩个节点,一个订单一个购物车,访问10次的话,负载均衡会让请求左右各访问5次,进行负载)

  • 滚动更新

可以根据应用的变化(比如添加一个功能节点),检查无误了进行一次或批量的更新

  • 版本回滚

根据应用部署情况,对历史版本进行回退

  • 密钥和配置管理

在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类型热部署

  • 存储编排

自动实现存储系统挂载应用,系统储存方式可以是本地目录,网络存储(NFS,GLuster,Ceph等),公共云存储服务

  • 批处理

批量数据处理的任务


3.k8s集群构架组件

Master(主控节点)组件

  • Api Server:集群统一入口,以rest ful方式交给etcd存储(分布式键值存储)

  • controller-manager:控制管理,处理集群中常规后台任务,一个资源对应一个控制器

  • scheduler:节点调度,选择node节点应用部署

  • etcd:存储系统,用于保存集群的数据

Node(工作节点):具体工作

  • kubelet:master节点派到node节点代表,管理本地容器
  • kube-proxy:提高网络代理,负载均衡操作
  • docker:容器化操作

在这里插入图片描述

4.K8s集群的核心内容

在这里插入图片描述

4.1Pod

最小部署单元

一组容器集合

共享同一网络

重启立马生成一个新的,生命周期短

4.2controller

确保预期状态下的pod副本数量

无状态部署(没有条件)

有状态部署(有条件的,如:同一ip网络或者存储方式等)

确保所有node运行同一个pod

一次性任务和定时任务

4.3Service

定义一组pod的访问规则,同一通信入口


5.搭建K8s集群
5.1k8s搭建平台规划

在这里插入图片描述

5.2环境要求

测试环境要求:

cpu至少2核,内存至少4G,硬盘至少20G

禁止swap分区

所有服务器均可以互通,可以访问外网(拉镜像)

5.3搭建k8s方式

1.kubeadm

kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具,俩条命令完成一个k8s集群的部署,但是不利于排错。

2.二进制包

5.4k8s集群部署(kubeadm方式)

环境要求:

系统 ip
centos8 192.168.136.230(k8s-master)
centos8 192.168.136.233(k8s-node1)
centos8 192.168.136.219(k8s-node2)

关闭防火墙

[root@k8s-master ~]#  systemctl disable --now firewalld
[root@k8s-master ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config 
[root@k8s-master ~]# setenforce 0
[root@k8s-node2 ~]# systemctl disable --now firewalld
[root@k8s-node2 ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config 
[root@k8s-node2 ~]# setenforce 0
[root@k8s-node1 ~]# systemctl disable --now firewalld
[root@k8s-node1 ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config 
[root@k8s-node1 ~]# setenforce 0

关闭swap(3台均配置)

[root@k8s-master ~]# swapoff -a    //临时关闭
[root@k8s-master ~]# vim /etc/fstab     //永久关闭
#/dev/mapper/cs_8--4-swap none                    swap    defaults        0 0
[root@k8s-master ~]#sed -ri 's/.*swap.*/#&/' /etc/fstab    //永久关闭,俩种方式

master服务器上所有服务器的主机名

[root@k8s-master ~]# cat >> /etc/hosts <<EOF
192.168.136.230 k8s-master
192.168.136.233 k8s-node1
192.168.136.219 k8s-node2
EOF

将桥接的IPV4流量传递到iptables的链(3台均配置)

cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system   //生效

时间同步(3台均配置)

yum -y install chrony
systemctl enable --now chronyd

master免密登录,确保直接连接管理

ssh-keygen -t rsa
ssh-copy-id k8s-node1
ssh-copy-id k8s-node2

所有节点安装Docker/kubeadm/kubelet

kubernetes默认是容器运行状态,因此先安装docker

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl enable --now docker

cat >  /etc/docker/daemon.json <<EOF
{
    
    
     "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
systemctl restart docker

添加kubernetes阿里云YUM软件源(3台均配置)

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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

安装kubeadm,kubelet和kubectl(3台均配置)

由于版本更新频繁,可以指定稳定版本

kubeadm:引导集群的命令

kubelet:集群中的所有服务器上运行的组件,如启动pod和容器之类的操作

kubectl:用于和你的集群通信的命令行实用程序

yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0
systemctl enable   kubelet

Master上部署kubernetes

默认拉取镜像地址为k8s.gcr.io国内无法访问,指定阿里云的镜像仓库地址

#192.168.136.230上执行
[root@k8s-master ~]# kubeadm init \
  --apiserver-advertise-address=192.168.122.230 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.20.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16

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                                        //此处用于配置kubectl工具
  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.136.230:6443 --token o59qlj.mfkcaw91f7q0o6i0 \  #用于加入node服务器
    --discovery-token-ca-cert-hash sha256:453979b43df91f9973171b166bd8e47c7d6ab4e14d0222dd1e471e93860b3a5f 

查看拉取的镜像

[root@k8s-master ~]# docker images
REPOSITORY                                                        TAG        IMAGE ID       CREATED         SIZE
registry.aliyuncs.com/google_containers/kube-proxy                v1.20.0    10cc881966cf   11 months ago   118MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.20.0    3138b6e3d471   11 months ago   46.4MB
registry.aliyuncs.com/google_containers/kube-apiserver            v1.20.0    ca9843d3b545   11 months ago   122MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.20.0    b9fa1895dcaa   11 months ago   116MB
registry.aliyuncs.com/google_containers/etcd                      3.4.13-0   0369cf4303ff   15 months ago   253MB
registry.aliyuncs.com/google_containers/coredns                   1.7.0      bfe3a36ebd25   17 months ago   45.2MB
registry.aliyuncs.com/google_containers/pause                     3.2        80d28bedfe5d   21 months ago   683kB

使用kubectl工具

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

[root@k8s-master ~]# kubectl get nodes
NAME         STATUS     ROLES                  AGE     VERSION
k8s-master   NotReady   control-plane,master   5m42s   v1.20.0

添加Kubernetes Node

在192.168.122.233、192.168.122.219(Node)上执行

[root@k8s-node1 ~]# kubeadm join 192.168.136.230:6443 --token o59qlj.mfkcaw91f7q0o6i0 \
    --discovery-token-ca-cert-hash sha256:453979b43df91f9973171b166bd8e47c7d6ab4e14d0222dd1e471e93860b3a5f 
[root@k8s-node2 ~]# kubeadm join 192.168.136.230:6443 --token o59qlj.mfkcaw91f7q0o6i0 \
    --discovery-token-ca-cert-hash sha256:453979b43df91f9973171b166bd8e47c7d6ab4e14d0222dd1e471e93860b3a5f     
#可以看到master已经有了俩node节点
[root@k8s-master ~]# kubectl get nodes
NAME         STATUS     ROLES                  AGE    VERSION
k8s-master   NotReady   control-plane,master   8m8s   v1.20.0
k8s-node1    NotReady   <none>                 20s    v1.20.0
k8s-node2    NotReady   <none>                 2s     v1.20.0

安装Pod网络插件(CNI)

在master上配置

[root@k8s-master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

#查看运行状态
[root@k8s-master ~]#  kubectl get pods -n kube-system
NAME                                 READY   STATUS    RESTARTS   AGE
coredns-7f89b7bc75-hl4xt             1/1     Running   0          14m
coredns-7f89b7bc75-s2djs             1/1     Running   0          14m
etcd-k8s-master                      1/1     Running   0          14m
kube-apiserver-k8s-master            1/1     Running   0          14m
kube-controller-manager-k8s-master   1/1     Running   0          14m
kube-flannel-ds-2lptv                1/1     Running   0          113s
kube-flannel-ds-cbg9w                1/1     Running   0          113s
kube-flannel-ds-sr57d                1/1     Running   0          113s
kube-proxy-gwl2p                     1/1     Running   0          14m
kube-proxy-q92jt                     1/1     Running   0          6m37s
kube-proxy-q9wlq                     1/1     Running   0          6m19s
kube-scheduler-k8s-master            1/1     Running   0          14m

#节点上的状态
[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES                  AGE   VERSION
k8s-master   Ready    control-plane,master   21m   v1.20.0
k8s-node1    Ready    <none>                 13m   v1.20.0
k8s-node2    Ready    <none>                 13m   v1.20.0

测试Kubernetes集群

在Kubernetes集群中创建一个pod,验证是否正常运行

#创建一个指定的名称部署
[root@k8s-master ~]# kubectl create deployment nginx --image=nginx

[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort

[root@k8s-master ~]#  kubectl get pod,svc
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-6799fc88d8-hnmhs   1/1     Running   0          2m28s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        25m
service/nginx        NodePort    10.100.203.19   <none>        80:32465/TCP   18s

web访问
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

至此部署完成!!

5.5存在的错误及解决方案
#kubeadm init初始化部署时长期没响应的话,俩个原因:1.网络问题,docker没有配置加速器 2.k8s的repo文件key开启,版本要求一致
进行重置然后再执行 kubeadm reset 

k8s集群部署(二进制基于证书方式)见k8s第二章

猜你喜欢

转载自blog.csdn.net/qq_47945825/article/details/121456776