有关k8s看这里
k8s概述
k8s是什么
1.k8s是开源的一个容器群集管理系统 简称k8s
2.k8s用于容器化应用程序的部署,扩展和管理
3.k8s提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能
4.k8s目标是让部署容器化应用简单高效。
k8s的特性
- 自我修复:在节点故障是重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断
- 弹性伸缩:使用命令UI或者基于CPU使用情况自动快速扩容和缩容应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。
- 自动部署和回滚:k8s采用滚动更新应用,一次更新一个pod,而不是同时删除所有的pod,如果更新过程中出现问题,将回滚更改,确保升级不收影响业务
- 服务发现和负载均衡:k8s为多个容器提供一个统一访问入口(内部ip地址和一个DNS名称),并且负载均衡关联的所用容器,使得用户无需开率容器的ip问题。
- 机密和配置管理:管理机密数据和应用程序配置,而不需要把蜜柑数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在k8s中,方便应用程序使用
- 存储编排:挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS,GlusterFS,Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性
- 批处理:提供一次性任务,定时任务,满足批量数据处理和分析的场景
k8s集群架构与组件
Master组价
kube-apiserver
Kubernetes API,集群的统一入口,各组件协调者,以RESful API提供接口 服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给 Etcd存储
kube-controller-manager
处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。
kube-scheduler
根据调度算法为新建的pos选择一个Node节点,可以在任意部署,可以部署在同一节点上,也可以部署在不同节点上
etcd
分布式键值存储系统。用于保存集群状态,比如pod,service等对象信息
Node组件
kubelet
kubelet是Master在Node节点上Agent,管理本机运行容器的生命周期,比如创建容器,pod挂载数据卷,下载secret,获取容器和节点状态等工作,kubelet将每个pod转换成一组容器
kube-proxy
在Node节点上实现pod网络代理,维护网络规则和四层负载均衡工作
docker或者rocket
容器引擎,运行容器
k8s核心概念
pod
- 最小部署单元
- 一组容器的集合
- 一个pod中的容器共享一个网络命名空间
- pod是短暂的
Controllers
- ReplicaSet:确保预期的pod副本数量
- Deployment:无状态应用部署
- StatrfulSet:确保所有Node运用同一个pod
- job:一次性任务
- Cronjob:定时任务
是更高级层次对象,部署和管理pod
Service
- 防止pod失联
- 定义一组pod的访问策略
Label
标签,附加到某个资源上,用于关联对象,查询和筛选
Namespaces
命名空间,将对象逻辑上隔离
Annotations
注释
k8s 单节点部署
部署环境
节点 | ip |
---|---|
master | 20.0.0.10 |
node1 | 20.0.0.11 |
node2 | 20.0.0.12 |
在master节点上
[root@localhost ~]# mkdir k8s
[root@localhost ~]# cd k8s/
[root@localhost k8s]# ls //从宿主机拖进来
etcd-cert.sh etcd.sh
[root@localhost k8s]# mkdir etcd-cert
[root@localhost k8s]# mv etcd-cert.sh etcd-cert
[root@localhost k8s]# ls /usr/local/bin/ #直接把文件拉进来
cfssl cfssl-certinfo cfssljson
[root@master01 k8s]#cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"www": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF 定义ca证书
[root@master01 k8s]# cat > ca-csr.json <<EOF
{
"CN": "etcd CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing"
}
]
}
EOF #实现证书签名
[root@master01 k8s]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca - #生成证书
[root@master01 k8s]# 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三个节点之间的通信验证 当三个节点的ip地址变了就需要重新制作证书和签名
把etcd包拖到k8s目录下 并且解压
[root@master01 k8s]# rz -E
rz waiting to receive.
[root@master01 k8s]# tar -zxvf etcd-
etcd-cert/ etcd-v3.3.10-linux-amd64.tar.gz
[root@master01 k8s]# tar -zxvf etcd-v3.3.10-linux-amd64.tar.gz#把etcd的tar包放到该目录下并且解压
创建三个目录 专门放 配置命令,命令文件和证书
[root@master01 etcd-v3.3.10-linux-amd64]# mkdir -p /opt/etcd/{cfg,bin,ssl} #创建三个目录 配置文件,命令文件,证书
[root@master01 k8s]# cd etcd-v3.3.10-linux-amd64/ #进到解压目录下
[root@master01 etcd-v3.3.10-linux-amd64]# mv etcd etcdctl /opt/etcd/bin/ #把etcd 和etcdctl 移动到 新建的bin目录下
[root@master01 k8s]# cd etcd-cert/
[root@master01 etcd-cert]# ls
ca-config.json ca-csr.json ca.pem server-csr.json server.pem
ca.csr ca-key.pem server.csr server-key.pem
[root@master01 etcd-cert]# cp *.pem /opt/etcd/ssl/ #把pem证书cp到新建的ssl目录下 专门放证书的目录
[root@master01 etcd-cert]# ls /opt/etcd/ssl/
ca-key.pem ca.pem server-key.pem server.pem
[root@master01 k8s]# ls #在把编写的shell脚本放入/k8s中
etcd-cert etcd.sh etcd-v3.3.10-linux-amd64 etcd-v3.3.10-linux-amd64.tar.gz
[root@master01 k8s]# vim etcd.sh
#!/bin/bash
ETCD_NAME=$1
ETCD_IP=$2
ETCD_CLUSTER=$3
WORK_DIR=/opt/etcd
cat <<EOF >$WORK_DIR/cfg/etcd
#[Member]
ETCD_NAME="${ETCD_NAME}"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://${ETCD_IP}:2380"
ETCD_LISTEN_CLIENT_URLS="https://${ETCD_IP}:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://${ETCD_IP}:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://${ETCD_IP}:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://${ETCD_IP}:2380,${ETCD_CLUSTER}"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF
cat <<EOF >/usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=${WORK_DIR}/cfg/etcd
ExecStart=${WORK_DIR}/bin/etcd \
--name=\${ETCD_NAME} \
--data-dir=\${ETCD_DATA_DIR} \
--listen-peer-urls=\${ETCD_LISTEN_PEER_URLS} \
--listen-client-urls=\${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \
--advertise-client-urls=\${ETCD_ADVERTISE_CLIENT_URLS} \
--initial-advertise-peer-urls=\${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
--initial-cluster=\${ETCD_INITIAL_CLUSTER} \
--initial-cluster-token=\${ETCD_INITIAL_CLUSTER_TOKEN} \
--initial-cluster-state=new \
--cert-file=${WORK_DIR}/ssl/server.pem \
--key-file=${WORK_DIR}/ssl/server-key.pem \
--peer-cert-file=${WORK_DIR}/ssl/server.pem \
--peer-key-file=${WORK_DIR}/ssl/server-key.pem \
--trusted-ca-file=${WORK_DIR}/ssl/ca.pem \
--peer-trusted-ca-file=${WORK_DIR}/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable etcd
systemctl restart etcd
[root@master01 k8s]# bash /root/k8s/etcd.sh etcd01 20.0.0.10 etcd02=https://20.0.0.11:2380,etcd03=https://20.0.0.12:2380 #这个时候运行脚本 会出现卡顿 是因为两个node节点没有etcd 所以我们要把一些数据 cp到两台node节点上
[root@master01 k8s]# scp -r /opt/etcd/ root@20.0.0.11:/opt/
[root@master01 k8s]# scp -r /opt/etcd/ root@20.0.0.12:/opt/
[root@master01 k8s]# scp /usr/lib/systemd/system/etcd.service root@20.0.0.11:/usr/lib/systemd/system/
[root@master01 k8s]# scp /usr/lib/systemd/system/etcd.service root@20.0.0.12:/usr/lib/systemd/system/
在node01 node02 上部署
[root@node01 cfg]# cd /opt/etcd/cfg/
[root@node01 cfg]# ls
etcd
[root@node01 cfg]# vim etcd
#[Member]
ETCD_NAME="etcd02" #因为是cp过来的原先是etcd01 需要修改成02
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://20.0.0.11:2380" #修改成本机的ip
ETCD_LISTEN_CLIENT_URLS="https://20.0.0.11:2379"#修改成本机的ip
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://20.0.0.11:2380"#修改成本机的ip
ETCD_ADVERTISE_CLIENT_URLS="https://20.0.0.11:2379"#修改成本机的ip
ETCD_INITIAL_CLUSTER="etcd01=https://20.0.0.10:2380,etcd02=https://20.0.0.11:2380,etcd03=https://20.0.0.12:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
~
[root@node01 cfg]# systemctl start etcd 启动一下etcd
node02节点同node01节点一样 把etcd01 改成 03 然后再改成本机的ip地址
最后做健康检查
/opt/etcd/bin/etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://20.0.0.10:2379,https://20.0.0.11:2379,https://20.0.0.12:2379" cluster-health