K8s简介

什么是k8s

本质上就是一组服务器集群,k8s可以在集群的各个节点上运行特定的docker容器。是一个容器集群管理系统

k8s功能

  • 自我修复
  • 弹性伸缩,实时根据服务器的并发情况,增加或缩减容器数量
  • 自动部署
  • 回滚
  • 服务发现和负载均衡
  • 机密和配置共享管理

k8s集群架构和组件

master node(主节点)的组件(程序)

  • apiserver:接收客户端操作k8s的指令
  • schduler:从多个work node节点的组件中选举一个来启动服务
  • controller manager:向worker节点的kubelet发送指令

work node:工作节点的组件(程序)

  • kubelet:向docker发送指令,管理docker容器
  • kubeproxy:管理docker容器的网络

etcd

  • k8s的数据库
  • 用来注册节点、服务、记录账户

k8s核心概念

在这里插入图片描述

Pod

  • pod是k8s最小部署单元
  • 一个pod中可以有一个或多个容器,所有pod又称为容器组
    k8s是否可以直接启动容器?不可以

Controllers

控制器,控制pod,启动,停止,删除

  • ReplicaSet:确保预期的Pod副本数量
  • Deployment:无状态应用部署
  • StatefulSet:有状态应用部署
  • DaemonSet:确保所有Node运行同一个Pod
  • Job:一次性任务
  • Cronjob:定时任务

service

将一组pod关联起来,提供一个统一的入口。即使pod地址发生改变,这个统一的入口也不会变化,可以保证用户访问不受影响
在这里插入图片描述

Label

一组pod是一个统一的标签,service是通过标签和一组pod进行关联的

Namespace

用来隔离pod的运行环境【默认情况下,pod是可以互相访问】
使用场景:

  • 为不同的公司提供隔离的pod运行环境
  • 为开发环境、测试环境、生产环境分别准备不同的名称空间,进行隔离

搭建一个完整的Kubernetes集群

架构类别

单master
多master(生产环境)

生产环境k8s规划

  • master建议3台
  • etcd必须三台或三台以上(3,5,7。。。),必须为奇数,保证可以选举出主节点
  • worker越多越好

实验环境规划

三个节点
2G内存
2核CPU

官方提供三种部署方式

  • minikube
  • kubeadm
  • 二进制(推荐)

部署单master集群

一、集群规划

在这里插入图片描述
master
主机名:k8s-master1
IP:192.168.31.63
worker1
主机名:k8s-node1
IP:192.168.31.65
worker2
主机名:k8s-node2
IP:192.168.31.66
k8s版本:1.16
安装方式:离线-二进制
操作系统版本:centos 7.7

二、初始化服务器
  • 1.关闭防火墙【所有节点都执行】
systemctl stop firewalld
systemctl disable firewalld
  • 2.关闭selinux【所有节点都执行】
setenforce 0(临时关闭,重启失效)
vim /etc/selinux/config
SELINUX=disabled
  • 3.配置主机名【所有节点都执行】
hostnamectl set-hostname k8s-master1

hostname
  • 4.配置名称解析【所有节点都执行】
vim /etc/hosts
192.168.31.63  k8s-master1
192.168.31.65  k8s-node1
192.168.31.66  k8s-node2
  • 5.配置时间同步
    选择一个节点作为服务端,剩下的作为客户端
    master1为时间服务器的服务端
    其他的为时间服务器的客户端
    1>配置k8s-master1
yum install chrony -y
vim /etc/chrony.config
修改三项
	server 127.127.1.0 iburst
	allow 192.168.31.0/24
	local stratum 10
systemctl start chronyd
systemctl enable chronyd
ss -unl | grep 123

在这里插入图片描述
2>配置k8s-node1和k8s-node2

yum install chrony -y
vim /etc/chrony.config
修改一项
	server 192.168.31.63 iburst
systemctl start chronyd
systemctl enable chronyd

systemctl restart chronyd
chronyc sources

date

在这里插入图片描述

  • 6.关闭交换分区【所有节点都执行】
swapoff -a
vim /etc/fstab
删除最后一行

free -m(确认交换分区是否关闭成功)

在这里插入图片描述

三、给etcd颁发证书
  • 1、创建证书颁发机构
  • 2、填写表单——写明etcd所在节点的ip
  • 3、向证书颁发机构申请证书
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
加密

对称加密:加密解密使用相同的密钥
非对称加密:用公钥和私钥的密钥对,公钥加密,私钥解密
单向加密:只能加密,不能解密。MD5

ssl证书来源

网络第三方机构购买,通常这种证书用于让外部用户访问使用
自己给自己发证书-自签证书,通常用于内部环境
签证机构(CA)

自建CA
  • openssl
  • cfssl(推荐)
四、部署etcd

etcd需要三台虚拟机
在master,node1,node2上分别安装一个etcd。
注意:解压之后会生成一个文件和一个目录
问题:centos7 systemd服务管理脚本在哪个目录
/usr/lib/systemd/system

mv etcd.service /usr/lib/systemd/system
mv etcd /opt/
vim /opt/etcd/cfg/etcd.conf

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

#拷贝到其他节点
scp /usr/lib/systemd/system/etcd.service root@k8s-node1:/usr/lib/systemd/system

scp -r /opt/etcd/ root@k8s-node2:/opt/

在这里插入图片描述
依次启动etcd
在这里插入图片描述
检查启动状态

/opt/etcd/bin/etcdctl \
--ca-file=/opt/etcd/ssl/ca.pem --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem \
--endpoints="https://192.168.31.63:2379,https://192.168.31.65:2379,https://192.168.31.66:2379" \
cluster-health

在这里插入图片描述

五、部署master
  • 生成apiserver证书
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 部署apiserver,controller-manager和scheduler
tar xvf k8s-master.tar.gz
mv kube-apiserver.service kube-controller-manager.service kube-scheduler.service /usr/lib/systemd/system/
mv kubernetes/ /opt/
cp TLS/k8s/{ca*pem,server.pem,server-key.pem} /opt/kubernetes/ssl/ -rvf

在这里插入图片描述
修改apiserver的配置文件
在这里插入图片描述

  • 启动服务
systemctl start kube-apiserver
systemctl enable kube-apiserver
systemctl enable kube-scheduler
systemctl  start kube-scheduler
systemctl start kube-controller-manager
systemctl enable kube-controller-manager
ps aux|grep kube

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

  • 配置tls 基于bootstrap自动颁发证书
    在这里插入图片描述
    在这里插入图片描述
kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap
六、部署Node组件
安装docker

启动容器

scp k8s-node.tar.gz root@k8s-node2:/root/apps/
tar xvf k8s-node.tar.gz 
mv docker.service /usr/lib/systemd/system
mkdir /etc/docker
cp daemon.json  /etc/docker/
tar xf docker-18.09.6.tgz 
mv docker/* /bin/
systemctl start docker
systemctl enable docker
docker info
安装kubelet和kube-proxy

kubelet接收apiserver的指令,然后控制docker容器。
kube-proxy为worker上的容器配置网络工作

  • 生成程序目录和管理脚本,并修改配置文件(4个)
ls kubernetes/
mv kubelet.service kube-proxy.service /usr/lib/systemd/system/
mv kubernetes /opt/
vim /opt/kubernetes/cfg/kube-proxy.kubeconfig
修改一行:server:https://192.168.31.63.6443
vim /opt/kubernetes/cfg/kube-proxy-config.yml
vim /opt/kubernetes/cfg/kubelet.conf
vim /opt/kubernetes/cfg/bootstrap.kubeconfig

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

  • 从master节点复制证书到worker节点
scp apps/TLS/k8s/{ca.pem,kube-proxy.pem,kube-proxy-key.pem} root@k8s-node1:/opt/kubernetes/ssl/
  • 启动kubelet和kube-proxy服务
systemctl start kube-proxy
systemctl start kubelet
systemctl enable kubelet
systemctl enable kube-proxy
tail -f /opt/kubernetes/logs/kubelet.INFO
  • 在master节点为worker节点颁发证书
    在这里插入图片描述
kubectl get csr
kubectl certificate approve node-csr-5b8Ajv0qUq-xv6iahZtSKQ_k0bHqznLRYeRNEpvuYJI
kubectl get csr

在这里插入图片描述

  • node2如法炮制
    在这里插入图片描述
安装网络插件
  • 确认启用CNI插件
grep "cni" /opt/kubernetes/cfg/kubelet.conf

在这里插入图片描述

  • 安装cni
mkdir -pv /opt/cni/bin /etc/cni/net.d
tar xf cni-plugins-linux-amd64-v0.8.2.tgz -C /opt/cni/bin/
  • 在master上执行yaml脚本,实现在worker节点安装启动网络插件
kubectl apply -f kube-flannel.yaml
kubectl delete -f kube-flannel.yaml
kubectl get pods -n kube-system
kubectl get nodes

在这里插入图片描述
这个操作受限于网络,可能会需要5-10分钟才能执行成功。如果网络太慢,会导致超时
由于网速太慢,使用离线包的形式导入镜像

docker load --input flannel_v0.11.0-amd64.tar

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

授权apiserver可以访问kubelet
kubectl apply -f apiserver-to-kubelet-rbac.yaml
kubectl describe node k8s-node2
七、启动nginx容器
#修改镜像加速配置
vim /etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker
scp  nginx-1.7.9.tar.gz root@k8s-node2:/root/apps/
docker pull nginx:1.7.9
docker image ls
#将镜像导出为压缩包
docker save nginx:1.7.9>./nginx-1.7.9.tar.gz
scp  nginx-1.7.9.tar.gz root@k8s-node2:/root/apps/
#导入压缩包为镜像
docker load -i nginx-1.7.9.tar.gz
#启动nginx
##创建deployment,通过deployment来创建和管理nginx容器
kubectl create deployment myweb --image=nginx:1.8
## 查看一下deployment的状态
kubectl get deployment
## 查看一下pod的状态
kubectl get pods
## 查看pod的详细状态
kubectl describe pod myweb1-6ff756695f-824fh

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

kubectl create deployment newweb --image=nginx:1.8
kubectl create deployment testweb --image=nginx:1.8
kubectl get pods
##端口暴露
kubectl expose deployment myweb --port=80 --type=NodePort
kubectl get svc

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

八、配置web界面

有两种

  • 官方:kubernetes dashboard
  • 第三方:kuboard(推荐)
安装kuboard
  • 获取Kuboard镜像
docker pull eipwork/kuboard:latest
docker images | grep kuboard
# 将镜像导成文件
docker save 9fccf2a94412 > kuboard.tar
  • 加载Kuboard镜像
docker load < kuboard.tar
# 为镜像重新添加标签
docker tag 9fccf2a94412 eipwork/kuboard:latest
scp kuboard.tar root@k8s-node2:/root/apps/
  • 准备kuboard.yaml文件
# 执行yaml文件
kubectl apply -f kuboad-offline.yaml

在这里插入图片描述
-查看安装

kubectl get pods -n kube-system
# 查看服务端口
kubectl get svc -n kube-system

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

  • 登录界面
    在这里插入图片描述
#获取 token
kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d

在这里插入图片描述

九、安装dns组件

k8s中用来实现名称解析的是coreDns

kubectl apply -f coredns.yaml

在这里插入图片描述

十、远程管理k8s

默认情况下,k8s仅仅可以在master节点进行管理

在这里插入代码片

1>将管理工具复制到worker节点【master执行】

scp /bin/kubectl root@k8s-node2:/bin

2>生成管理员证书

vim admin-csr.json
{
  "CN": "admin",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "BeiJing",
      "ST": "BeiJing",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}
# 颁发证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-scr.json | cfssljson -bare admin

在这里插入图片描述
3>创建kubeconfig文件

  • 设置集群参数
kubectl config set-cluster kubernetes \
  --server=https://192.168.31.63:6443 \
  --certificate-authority=ca.pem \
  --embed-certs=true \
  --kubeconfig=config
  • 设置客户端认证参数
kubectl config set-credentials cluster-admin \
  --certificate-authority=ca.pem \
  --embed-certs=true \
  --client-key=admin-key.pem \
  --client-certificate=admin.pem \
  --kubeconfig=config
  • 设置上下文参数
kubectl config set-context default \
  --cluster=kubernetes \
  --user=cluster-admin \
  --kubeconfig=config
  • 设置默认上下文
kubectl config use-context default --kubeconfig=config

4>将生成的config文件发送到worker节点

scp config root@k8s-node2:/root/

5>在worker节点,基于config实现执行kubetcl命令

kubectl get nodes --kubeconfig=config
mkdir ~/.kube
mv /root/config /root/.kube/

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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐