k8s(一)——k8s组件介绍以及集群部署
k8s(一)——k8s组件介绍以及集群部署
k8s组件介绍以及集群部署
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/
更多推荐
所有评论(0)