Kubernetes入门基础:K8S单节点群集部署

Kuberetes简介

Kubernetes 简称 “K8S” ,是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。Kubernetes提供了应用部署,规划,更新,维护的一种机制。提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能。在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
其特点是
自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
可移植: 支持公有云,私有云,混合云,多重云
可扩展: 模块化,插件化,可挂载,可组合

K8S的特性

自我修复
在节点故障时“重新启动”(容器不能重新启动,发生故障只能删掉重新创建)失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。

弹性伸缩
使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用成俗实例,保证应用业务高峰并发时的高可用;业务低峰时回收资源,以最小成本运行服务。
自动部署和回滚

K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务。

服务发现和负载均衡
K8S为多个容器提供一个统一访问入口(内部IP地址和DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。

机密和配置管理
管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。

存储编排
挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用, 极大提高 存储使用灵活性。

批处理
提供一次性任务,定时任务;满足批量数据处理和分析的场景。

K8S集群架构与组件

架构与组件
在这里插入图片描述
Master 负责为用户和客户端提供API访问入口、追踪集群节点的健康状态、调度工作负载、以及编排其他组件之间的通信等。
1:Master节点中涉及到的组件有:
组件一:API server
API server是集群的唯一访问入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。
组件二:controller-manager
处理集群中常规后台任务,一个资源对应一个控制器,而controller-manager就是负责管理这些控制器的
组件三: scheduler
根据调度算法为新创建的pod选择一个node节点,可以任意部署,可以部署再同一个节点上,也可以部署在不同的节点上。
node节点接收到创建容器的任务,scheduler就会重新为所有节点评分, 通过计算每个节点的积分,分数越高的节点被分配到任务的概率也就越大。所以这个积分不是静态的而是动态的。而scheduler将创建任务交给api server与各个节点进行通信。
组件四: etcd 数据库
分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息。
最后的实验部分就是etcd群集的部署
etcd 最大的特点是拥有自动发现服务功能
另外安装配置简单、支持SSL证书验证比较安全 、可靠 、采用raft算法,实现分布式系统数据的可用性和一致性。

2:Node节点涉及到的组件有:
node节点是以 pod 的形式运行容器,Node 节点负责接收来自 master 的工作指令并根据指令来创建或销毁 pod(容器) 对象,以及调整网络规划以便合理的路由和转发流量。
组件一: kubelet
kubelet 是Master在Node节点上的Agent代理,管理本机运行的容器,并执行master传来的操作指令,如创建容器、Pod挂载数据卷、下 载secret、
获取容器和节点状态等。pod是K8S管理的最小单元,pod中可以放多个容器,一般生产环境放一个容器

组件二:kube-proxy
在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作

组件三:docker或rocket
容器引擎,运行容器

核心概念

Pod: 是最小部署单元;是一组容器的集合;一个Pod中的容器共享网络命名空间;并且Pod是短暂的
Controllers
·ReplicaSet:确保预期的Pod副本数量
·Deployment:无状态应用 {如:web、nignx、apache、tomcat}
·StatefulSet:有状态应用部署 {如:mysql}

无状态:如群集中的某一台服务器出现故障,其他服务器能正常提供服务,但客户端无法感知后端web服务器的变化
有状态:该应用独一无二,无法重新创建进行完美替代,例如mysql、Oracle数据库

·DaemonSet:确保所有的Node运行同一个Pod(把所有的Node设置为同一个命名空间)
·Job:一次性任务 (类似linux:at)
·Cronjob:定时任务(类似linux:crontab)

更高层次对象,部署和管理Pod

Service:防止Pod失联;定义一组Pod访问的策略(主要作用);确保每个Pod之间的独立性(安全)

Label:标签,附加到某个资源上,用于关联对象、查询和筛选

Namespaces:命名空间,将对象逻辑上隔离

Annotations:注释

以上是理论部分

K8S 单master群集部署

架构如图所示:
在这里插入图片描述

Kubernetes 二进制部署分配:

Master节点
master01: 192.168.195.149/24

Node节点
node01: 192.168.195.150/24
node02: 192.168.195.151/24

Harbor私有仓库
192.168.195.80/24

负载均衡
Nginx01: 192.168.195.133/24
Nginx02: 192.168.195.136/24

一:首先部署etcd群集

Master节点: 192.168.195.149
需安装 kube-apiserver、kube-controller-manager、kube-scheduler、etcd

Node1节点: 192.168.195.150
需安装 kubelet、kube-proxy、docker、flannel、etcd

Node2节点: 192.168.195.151
需安装 kubelet、kube-proxy、docker、flannel、etcd

其中node1 node2节点 已经提前部署好docker引擎,不清楚docker部署可以看 我之前的博客:docker 部署

1:制作CA证书(master节点)

1)下载制作证书相关的cfssl官方包

# cd /root
# mkdir k8s
# cd k8s

下载cfssl官方包
# curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl
# curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson
# curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfo

# chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson /usr/local/bin/cfssl-certinfo

把制作证书的工具包放到/usr/local/bin目录下,并给执行权限
在这里插入图片描述
2)制作CA证书

# cd /root/k8s
# mkdir etcd-cert
# cd /root/k8s/etcd-cert
CA证书
# cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "www": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF

实现证书签名
# cat > ca-csr.json <<EOF
{
    "CN": "etcd CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing"
        }
    ]
}
EOF
产生证书
# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -

生成ca-key.pem、ca.pem

产生CA证书
在这里插入图片描述

2:生成ETCD证书(master节点)

指定3个节点之间的通讯验证

# cat > server-csr.json <<EOF
{
    "CN": "etcd",
    "hosts": [
    "192.168.195.149",
    "192.168.195.150",
    "192.168.195.151"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing"
        }
    ]
}
EOF

生成ETCD证书

# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server

在这里插入图片描述

3:etcd相关配置(master节点)

解压etcd软件包
把 CA证书, etcd配置文件,还有etcdctl 远程复制到node节点

# cd  /root/k8s
# rz -E
把etcd-v3.3.10-linux-amd64.tar.gz、kubernetes-server-linux-amd64.tar.gz、
flannel-v0.10.0-linux-amd64.tar.gz  这3个包拉过来

解压etcd软件包
# tar zxvf etcd-v3.3.10-linux-amd64.tar.gz

递归创建etcd相关目录,方便后面把 CA证书, etcd配置文件,还有etcdctl 远程复制到node节点
# mkdir /opt/etcd/{cfg,bin,ssl} -p

把master节点中的配置文件和agent代理文件放到 bin目录下
# mv etcd-v3.3.10-linux-amd64/etcd  etcd-v3.3.10-linux-amd64/etcdctl  /opt/etcd/bin

把CA证书复制到 ssl 目录下
# cp etcd-cert/*.pem /opt/etcd/ssl

master节点 执行etcd.sh脚本,会产生两个文件 :配置文件、启动文件
# bash etcd.sh etcd01 192.168.195.149 etcd02=https://192.168.195.150:2380,etcd03=https://192.168.195.151:2380

进入卡住状态 等待其他节点加入,如果迟迟没有节点加入 就显示etcd启动失败
在这里插入图片描述

另开终端,可看到产生了etcd配置文件

# cd /opt/etcd/cfg
# ls    		    

把证书 配置文件等和启动脚本复制到2个docker节点

# scp -r /opt/etcd/ root@192.168.195.150:/opt
# scp -r /opt/etcd/ root@192.168.195.151:/opt

把启动脚本也复制过去
# scp /usr/lib/systemd/system/etcd.service root@192.168.195.150:/usr/lib/systemd/system/
# scp /usr/lib/systemd/system/etcd.service root@192.168.195.151:/usr/lib/systemd/system/

在这里插入图片描述

4:node节点配置(node节点)

更改两个node节点的配置文件中的名称和IP

在docker1上改配置文件(改名称和IP)
# cd /opt/etcd/cfg 
# vim etcd
改为:
ETCD_NAME=etcd02
ETCD_LISTEN_PEER_URLS="https://192.168.195.150:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.195.150:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.195.150:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.195.150:2379"
在docker2上改配置文件(改名称和IP)
# cd /opt/etcd/cfg 
# vim etcd
改为:
ETCD_NAME=etcd03
ETCD_LISTEN_PEER_URLS="https://192.168.195.151:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.195.151:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.195.151:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.195.151:2379"

在这里插入图片描述
在这里插入图片描述

5:再次开启群集

执行以下命令之后,把两个node节点快速开启,没有任何错误就说明启动成功

master操作

# cd  /root/k8s
# bash etcd.sh etcd01 192.168.195.149 etcd02=https://192.168.195.150:2380,etcd03=https://192.168.195.151:2380

node节点操作

# systemctl start etcd    开启etcd
# systemctl status etcd

在这里插入图片描述
检查群集状态

# cd /root/k8s/etcd-cert
# /opt/etcd/bin/etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.195.149:2379,https://192.168.195.150:2379,https://192.168.195.151:2379" cluster-health

在这里插入图片描述
所有节点查看2380端口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二:搭建flannel网络

1:master节点设置flannel网络

并查看flannel网络

设置
# /opt/etcd/bin/etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.195.149:2379,https://192.168.195.150:2379,https://192.168.195.151:2379" set /coreos.com/network/config '{ "Network": "176.17.0.0/16", "Backend": {"Type": "vxlan"}}'

查看
# /opt/etcd/bin/etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.195.149:2379,https://192.168.195.150:2379,https://192.168.195.151:2379" get /coreos.com/network/config

在这里插入图片描述

2:node节点配置flannel网络

哪个节点需要跑pod ,就需要装flannel,所以flannel是在node节点上装的
两个node节点同步操作:

1)解压flannel软件包及相关配置

# cd ~
# rz -E
把 flannel-v0.10.0-linux-amd64.tar.gz 包

# tar zxvf flannel-v0.10.0-linux-amd64.tar.gz

# mkdir /opt/kubernetes/{cfg,bin,ssl} -p
# mv mk-docker-opts.sh flanneld /opt/kubernetes/bin/

2)配置flannel网络脚本

# vim flannel.sh
#!/bin/bash

ETCD_ENDPOINTS=${1:-"http://127.0.0.1:2379"}

cat <<EOF >/opt/kubernetes/cfg/flanneld

FLANNEL_OPTIONS="--etcd-endpoints=${ETCD_ENDPOINTS} \
-etcd-cafile=/opt/etcd/ssl/ca.pem \
-etcd-certfile=/opt/etcd/ssl/server.pem \
-etcd-keyfile=/opt/etcd/ssl/server-key.pem"

EOF

cat <<EOF >/usr/lib/systemd/system/flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network-online.target network.target
Before=docker.service

[Service]
Type=notify
EnvironmentFile=/opt/kubernetes/cfg/flanneld
ExecStart=/opt/kubernetes/bin/flanneld --ip-masq \$FLANNEL_OPTIONS
ExecStartPost=/opt/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env
Restart=on-failure

[Install]
WantedBy=multi-user.target

EOF

systemctl daemon-reload
systemctl enable flanneld
systemctl restart flanneld

3)开启flannel网络功能

 bash flannel.sh https://192.168.195.149:2379,https://192.168.195.150:2379,https://192.168.195.151:2379

# systemctl status flanneld      查看flannel网络状态

在这里插入图片描述
在这里插入图片描述
4)配置docker 连接flannel

# vim /usr/lib/systemd/system/docker.service
添加:   EnvironmentFile=/run/flannel/subnet.env
修改为:  ExecStart=/usr/bin/dockerd  $DOCKER_NETWORK_OPTIONS  -H  

# cat /run/flannel/subnet.env   查看各个node节点网段
# ifconfig

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
5)重启docker服务

# systemctl daemon-reload
# systemctl restart docker

6)验证两node节点能否互联互通

创建运行容器并进入容器:
# docker run -it centos:7 /bin/bash
# yum -y install net-tools 
# ifconfig
# ping 对方docker容器IP地址

测试ping通 对方docker容器IP,就证明flannel起到路由作用
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三:master组件部署

1:APIserver配置

1)创建API-server证书
为下次多节点部署准备,所以制作证书脚本中 提前添加了master2的IP和两台负载均衡的IP和keepalived双击热备所用的VIP地址

#cd /root/k8s
# rz -E
把master.zip拉过来
# unzip master.zip
apiserver.sh  controller-manager.sh  scheduler.sh
解压出来的3个脚本都要有执行权限
# chmod +x  controller-manager.sh

# mkdir /opt/kubernetes/{cfg,bin,ssl} -p
# mkdir k8s-cert
# cd k8s-cert
# rz -E
把 k8s-cert.sh 拉过来

# vim k8s-cert.sh
"10.0.0.1",
"127.0.0.1",在下行插入:
"192.168.195.149",	  --master1
"192.168.195.131",	  --master2
"192.168.195.100",	  --vip
"192.168.195.133",	  --lb (master)
"192.168.195.136",	  --lb ( backup )

在这里插入图片描述

# bash k8s-cert.sh	生成K8S证书
# ls | grep *.pem	生成8张证书
admin-key.pem   ca-key.pem  kube-proxy-key.pem  server-key.pem  
admin.pem        ca.pem      kube-proxy.pem     server.pem

在这里插入图片描述

为了 后面要把证书 配置文件等发到node节点 做准备
# cp ca*.pem server*.pem /opt/kubernetes/ssl
# ls /opt/kubernetes/ssl
ca-key.pem  ca.pem  server-key.pem  server.pem

在这里插入图片描述
2)解压kubernetes软件包

# cd /root/k8s
解压kubernetes软件包
# tar zxvf kubernetes-server-linux-amd64.tar.gz
# cd kubernetes/server/bin
# ls		各种组件包都在里面

复制关键命令文件,移到到/opt/kubernetes/bin,为后面要把证书 配置文件等发到node节点 做准备
# cp kube-controller-manager kubectl kube-apiserver kube-scheduler /opt/kubernetes/bin

在这里插入图片描述
3)制作token令牌

随机生成序列号
# head -c 16 /dev/urandom | od -An -t x | tr -d ‘ ‘
序列号复制下来

# cd /opt/kubernetes/cfg/
# vim token.csv
序列号粘贴进去
594f876bd55afc37019b02732d311a41,kubelet-bootstrap,10001,"system:kubelet-bootstrap"

在这里插入图片描述

在这里插入图片描述

4)开启APIserver服务,生成相关配置文件
前提: CA证书,二进制文件,token令牌,都已准备好

# cd /root/k8s
执行APIserver脚本,启动服务,生成配置文件
# bash apiserver.sh 192.168.195.149 https://192.168.195.149:2379,https://192.168.195.150:2379,https://192.168.195.151:2379
# ps aux | grep kube
# netstat -ntap | grep 6443	查看监听的HTTPS端口
# netstat -ntap | grep 8080

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2:启动scheduler 服务
# cd /root/k8s
# ./scheduler.sh 127.0.0.1
# ps -aux | grep scheduler
# systemctl status kube-scheduler.service

在这里插入图片描述

3:启动controller服务
# cd /root/k8s
# ./controller-manager.sh 127.0.0.1
# systemctl status kube-controller-manager.service

在这里插入图片描述

查看节点状态

# /opt/kubernetes/bin/kubectl get cs

在这里插入图片描述

4:把kubelet、 kube-proxy拷贝到node节点上去
# cd /root/k8s/kubernetes/server/bin
# scp kubelet kube-proxy root@192.168.195.150:/opt/kubernetes/bin/
# scp kubelet kube-proxy root@192.168.195.151:/opt/kubernetes/bin/

可以去node节点查看 是否有kubelet ,kube-proxy
在这里插入图片描述

5:创建kubeconfig

1) 执行脚本里有各种认证参数

# cd /root/k8s
# mkdir kubeconfig
# cd kubeconfig
# rz -E
把kubeconfig.sh 拉过来
# mv kubeconfig.sh kubeconfig
# cat /opt/kubernetes/cfg/token.csv
把序列号复制下来
# vim kubeconfig
删除以下部分
#创建TLS Bootstrapping Token
#BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An-t x | tr -d ‘ ’)
BOOTSTRAP_TOKEN=0fb61c46f8991b718eb38d27b605b008
cat > token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet- bootstrap,10001,"system:kubelet-bootstrap'
EOF
修改:
--token=594f876bd55afc37019b02732d311a41

在这里插入图片描述
2)生成kubeconfig配置文件

执行kubeconfig脚本,在本节点上 加载证书验证 生成相关配置文件
# bash kubeconfig 192.168.195.149 /root/k8s/k8s-cert 
# ls   可看到生成的配置文件
# scp bootstrap.kubeconfig kebu-proxy.kubeconfig root@192.168.195.150:/opt/kubernetes/cfg
# scp bootstrap.kubeconfig kebu-proxy.kubeconfig root@192.168.195.151:/opt/kubernetes/cfg

3)创建bootstrap 角色赋予权限用于连接apiserver请求签名

# kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap

在这里插入图片描述

四:node1节点配置

1:启动kubelet
# cd ~
# rz -E
把node.zip拉过来
# unzip node.zip
# bash kubelet.sh 192.168.195.150
# ps -aux | grep kubelet
# systemctl status kubelet

在这里插入图片描述
在master节点上颁发证书

查看集群状态
# kubectl get cs

查看到node01节点发来的请求
# kubectl get csr
 Pending(等待集群给该节点颁发证书)
 
给node节点颁发证书
# kubectl certificate approve 长串字符
# kubectl get csr
变成 Approved,Issued状态

查看node节点状态
# kubectl get nodes

在这里插入图片描述
给node节点颁发证书后,状态变成approved状态在这里插入图片描述
在这里插入图片描述

2:启动kube-proxy
# cd ~
# bash proxy.sh 192.168.195.150

查看kube-proxy状态
# systemctl status kube-proxy.service

在这里插入图片描述

3:把/opt/kubernetes目录复制到node2节点

之后进行修改即可

# scp -r /opt/kubernetes/ root@192.168.195.151:/opt
把启动脚本也复制过去
# scp -r /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@192.168.195.151:/usr/lib/systemd/system/

在这里插入图片描述

五:node2节点配置

首先删除复制过来node1的证书,后面 node02 会自行申请证书

# cd /opt/kubernetes/ssl
# rm -rf *

在这里插入图片描述

1:修改复制过来的配置文件
# cd /opt/kubernetes/cfg
# vim kubelet
IP改为本节点IP地址
# vim kubelet.config
IP改为本节点IP地址
# vim kube-proxy
IP改为本节点IP地址

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2:启动kubelet
# systemctl start kubelet
# systemctl enable kubelet
# systemctl status kubelet

在这里插入图片描述

3:启动kube-proxy
# systemctl start kube-proxy.service
# systemctl enable kube-proxy.service
# systemctl status kube-proxy.service

在这里插入图片描述

在master节点上颁发证书

查看到node02节点发来的请求
# kubectl get csr
 复制长串字符      Pending(等待集群给该节点颁发证书)
# kubectl certificate approve 长串字符
# kubectl get csr
Approved,Issued状态

# kubectl get nodes

在这里插入图片描述
查看node节点状态
在这里插入图片描述
单master节点部署完成。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值