Kubernetes(K8s) 学习笔记 updating...
官网:
https://kubernetes.io/
https://github.com/kubernetes/kubernetes
谷歌Borg,后经过Go语言重写并捐献给CNCF基金会开源
Kubernetes 舵手/飞行员
开源的容器编排框架工具(生态极其丰富)
Pod/Pod控制器
Pod
Pod控制器
Name/Namespace
Name
Namespace
Label/Label选择器
Label
Label选择器
Service/Ingress
Service
Ingress
kube-apiserver服务
controller-manager
scheduler
kubelet
kube-proxy
PS: k8s 三种网络 及IP划分推荐
NODE 节点网络(宿主机网络) 10.x.x.0/24
POD 容器网络 172.x.0.0/16
Service 集群网络 192.168.x.x/16
IP规划每个ip号码要有具体意义,便于排错 POD和NODE 要近似:
例如:
10 段代表Node网络
172 段代表Pod网络
192 段代表 Service网络
10.4.7.x/16 代表Node节点,4号机房下面的测试服务器,x号
10 = IDC的私有地址
4 = 机房区域(比如代表)
7 = 不同的项目,不同的环境(7测试,8预生产,9生产)
172.4.7.x/24 代表Pod节点,4号机房下面的测试服务器
K8S 逻辑架构图 参考
K8S 集群架构图
# 5台主机,1个VIP
10.4.7.10 VIP
10.4.7.200 运维主机
10.4.7.11 master
10.4.7.12 standby
10.4.7.21 主控节点、运算节点 核心组件
104.7.22 主控节点、运算节点 核心组件
K8S部署方式三种:
Minikube
# 直接Webshell 体验
https://kubernetes.io/zh/docs/tutorials/hello-minikube/
二进制安装部署
SSL 需要自签发证书(自签发证书:默认一年)
# 环境简介
192.168.27.101
192.168.27.102
192.168.27.103
192.168.27.104
192.168.27.105
# 初始化设置
安装和克隆虚拟机(略)
hostnamectl set-hostname <主机名>
调整yum源
yum install epel-release
关闭selinux和firewalld
setenforce 0
systemctl stop firewalld
必备工具安装
yum install wget net-tools telnet tree nmap sysstat lrzsz dos2unix bind-utils ntpdate -y
ntpdate ntp1.aliyun.com # 把所有测试机时间同步
安装DNS(bind)在 27.101
sudo yum install bind -y
主配置文件
vi /etc/named.conf
----------------修改内容--------------------
listen-on port 53 { 192.168.27.101; };
allow-query { any; };
dnssec-enable no;
dnssec-validation no;
-------------------增加内容-------------------
forwarders { 114.114.114.114; }; # 设置可用的DNS地址
# 检查DNS配置文件设置是否成功
sudo named-checkconf # 没有报错表示成功
区域配置文件
/etc/named.rfc1912.zones
---------------增加内容------------------------
zone "host.com" IN {
type master;
file "host.com.zone";
allow-update { 192.168.27.11; };
};
zone "od.com" IN {
type master;
file "od.com.zone";
allow-update { 192.168.27.11; };
};
区域数据文件
/var/named/host.com.zone
---------------增加内容----------------------------
$ORIGIN host.com. $TTL 600 ; 10 minutes @ IN SOA dns.host.com. dnsadmin.host.com. ( 2020071001 ; serial 10800 ; refresh (3 hours) 900 ; retry (15 minutes) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) NS dns.host.com. $TTL 60 ; 1 minute dns A 192.168.27.101 HDSS7-11 A 192.168.27.101 HDSS7-12 A 192.168.27.102 HDSS7-21 A 192.168.27.103 HDSS7-22 A 192.168.27.104 HDSS7-200 A 192.168.27.105
/var/named/od.com.zone
---------------增加内容----------------------------
$ORIGIN od.com. $TTL 600 ; 10 minutes @ IN SOA dns.host.com. dnsadmin.od.com. ( 2020071001 ; serial 10800 ; refresh (3 hours) 900 ; retry (15 minutes) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) NS dns.od.com. $TTL 60 ; 1 minute dns A 192.168.27.101
再次效验dns配置文件
named-checkconf
启动DNS服务
systemctl start named
使用dig测试解析结果
dig -t A hdss7-21.host.com @192.168.27.101 +short
看到此结果表示dns生效,现在就把你本地的dns指向到这个DNS服务器
vim /etc/sysconfig/network-scripts/ifcfg-ensXXX
------------------修改配置文件---------------------
DNS1=192.168.27.101 # IP为你搭建的DNS服务器IP
Tips: 添加短域名解析
/etc/resolv.conf
# Generated by NetworkManager
search host.com # 一般仅用于主机域
nameserver 192.168.27.101
# 使用短域名进行ping 也是可以解析
把所有剩下的服务器全部主DNS修改为192.168.27.101
准备签发证书环境
在运维主机上HDSS7-200(192.168.27.105)上:
CFSSL
是CloudFlare开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具 和一个用于 签名,验证并且捆绑TLS证书的 HTTP API 服务。 使用Go语言编写。
Github 地址: https://github.com/cloudflare/cfssl
官网地址: https://pkg.cfssl.org/
安装CFSSL
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/bin/cfssl
wget https://pkg.cfssl.org/R1.1/cfssljson_linux-amd64 -O /usr/bin/cfssl-json
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/bin/cfss-certinfo
chmod +x /usr/bin/cfssl*
创建一个证书目录
mkdir -p /opt/certs
sudo sh -c "cfssl print-defaults config > config.json" # 生成一个配置模板(这个步骤可以省略)
sudo sh -c " cfssl print-defaults csr > ca-csr.json" # 生成证书信息文件
创建文件 /opt/certs/ca-csr.json
-------------增加内容--------------------------
{ "CN": "Cdbaidu", "hosts": [ ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Chengdu", "ST": "Chengdu", "O": "od", "OU": "ops" } ], "ca": { "expiry": "175200h" # 20年 } }
签发生产字签证证书
cfssl gencert -initca ca-csr.json | sudo cfssl-json -bare ca
ca-csr.json # 上面编辑的文件名
ca 前缀
管道后面的是生产.pem文件
部署docker环境
HDSS7-200(192.168.27.105)
HDSS7-21(192.168.27.103)
HDSS7-22(192.168.27.104)
一条命令安装Docker环境
sh -c "curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun"
查看docker版本
配置参数
sudo vim /etc/docker/daemon.json
{ "graph": "/data/docker", "storage-driver": "overlay2", "insecure-registries": ["registry.access.redhat.com","quay.io","harbor.od.com"], "registry-mirrors": ["https://q2gr04ke.mirror.aliyuncs.com"], "bip": "172.7.21.1/24", # 这里根据自己HDSS7-21,设置了172.7.21.1/24方便记忆和排错 "exec-opts": ["native.cgroupdriver=systemd"], "live-restore": true }
sudo systemctl start docker # 启动docker服务
检查三台是否都已经成功配置docker引擎
docker version
部署docker私有镜像仓库
HDSS7-200(192.168.27.105)
下载完毕后进行解压
tar xf harbor-offline-installer-v2.0.1.tgz -C /opt/
mv harbor harbor-v2.0.1 # 增加版本号备注
ln -s /opt/harbor-v2.0.1/ /opt/harbor # 创建软链接便于以后升级
PS:harbor 依赖 docker-compose
yum install docker-compose -y
sudo mkdir -p /data/harbor/logs # 如果修改了日志存放目录需要创建对应目录
修改配置文件
cp /opt/harbor/harbor.yml.tmpl /opt/harbor/harbor.yml # 把模板文件变成正式的配置文件
----------------修改下面内容------------------------
http:
port: 180
hostname: harbor.od.com
harbor_admin_password: Harbor12345 # 生产环境自行修改
database:
password: root123 # 生产环境自行修改
data_volume:/data/harbor
location:/data/harbor/logs
开始执行harbor 脚本
/opt/harbor/install.sh
Note:遇到报错
ERROR:root:Error: The protocol is https but attribute ssl_cert is not set
方法一: 可以在配置文件里面注释掉和443相关部分
方法二:配置相关https的证书认证
https://www.cnblogs.com/Dev0ps/p/10566398.html
脚本执行成功,如下提示:
进行自检,输入 sudo docker-compose ps
看到harbor 给我们拉取和启用的各种镜像
安装Nginx
yum install nginx -y
创建配置文件
/etc/nginx/conf.d/harbor.od.com.conf
------------新增如下内容------------
server { listen 80; server_name harbor.od.com; client_max_body_size 1000m; location / { proxy_pass http://127.0.0.1:180; } }
检测nginx配置文件语法是否正常
sudo nginx -t
启动nginx
systemctl start nginx
systemctl enable nginx
PS: 这里为了方便,需要在HDSS7-11(192.168.27.101)添加一条dns记录.
vi /var/named/od.com.zone
-----------------修改和添加内容(见黄底红字处)----------------------
$ORIGIN od.com. $TTL 600 ; 10 minutes @ IN SOA dns.host.com. dnsadmin.od.com. ( 2020071002 ; serial 注意前滚一个序号 10800 ; refresh (3 hours) 900 ; retry (15 minutes) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) NS dns.od.com. $TTL 60 ; 1 minute dns A 192.168.27.101 harbor A 192.168.27.105
systemctl restart named
添加后进行测试,DNS是否成功
dig -t A harbor.od.com +short
使用客户端访问:
http://harbor.od.com:180/ # 看到如下界面
Harbor 页面操作
账号密码登陆--新建项目
# 在HDSS7-200(192.168.27.105)下载一个公网镜像
sudo docker pull nginx:1.7.9
docker tag <IMAGE ID > harbor.od.com/public/nginx:v.17.9 # 给公网镜像打一个tag
docker push harbor.od.com/public/nginx:v1.7.9 # 尝试推送到我们自己的私有仓库
Note: 错误提示
unauthorized: unauthorized to access repository: public/nginx, action: push: unauthorized to access repository: public/nginx, action: push
原因是需要登陆你的私有仓库,不然没有授权网上传。
docker login harbor.od.com
输入你私有仓库的账号密码,Push成功
部署Master节点服务
部署etcd集群
集群规划
HDSS7-12 角色:etcd lead 192.168.27.102
HDSS7-21 角色:etcd follow 192.168.27.103
HDSS7-22 角色:etcd follow 192.168.27.104
创建基于根证书的config配置文件
HDSS7-200(27.105)上 /opt/certs/
vim /opt/certs/ca-config.json
-----------------------新增以下内容------------------------------
1 { 2 "signing": { 3 "default": { 4 "expiry": "1725200h" 5 }, 6 "profiles": { 7 "server": { 8 "expiry": "1725200h", 9 "usages": [ 10 "signing", 11 "key encipherment", 12 "server auth" 13 ] 14 }, 15 "client": { 16 "expiry": "1725200h", 17 "usages": [ 18 "signing", 19 "key encipherment", 20 "client auth" 21 ] 22 }, 23 "peer": { 24 "expiry": "1725200h", 25 "usages": [ 26 "signing", 27 "key encipherment", 28 "server auth", 29 "client auth" 30 ] 31 } 32 } 33 } 34 }
创建etcd-peer-csr文件
vim etcd-peer-csr.json
------------新增以下内容-----------------------
1 { 2 "CN": "k8s-etcd", 3 "hosts": [ 4 "192.168.27.101", 5 "192.168.27.102", 6 "192.168.27.103", 7 "192.168.27.104" 8 ], 9 "key": { 10 "algo": "rsa", 11 "size": 2048 12 }, 13 "names": [ 14 { 15 "C": "CN", 16 "ST": "beijing", 17 "L": "beijing", 18 "O": "od", 19 "OU": "ops" 20 } 21 ] 22 }
签发证书
依然保持/opt/crets目录下(确保上面2个文件已经创建成功)
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer etcd-peer-csr.json
# 产生签发证书文件
sudo cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer etcd-peer-csr.json | sudo cfssl-json -bare etcd-peer
回到节点:HDSS7-12(27.102)上
创建用户
useradd -s /sbin/nologin -M etcd
-M 没有家目录
下载etcd的软件
# 教程里面推荐不超过3.3.x的版本
tar zxvf etcd-v3.x.x-linux-amd64.tar.gz -C /opt
cd /opt
ln -s /opt/etcd-v3.x.x /opt/etcd
创建etcd的证书存放目录
sudo mkdir -p /opt/etcd/certs /data/etcd /data/logs/etcd-server
# 拷贝上面生成的证书到/opt/etcd/certs 下面
给etcd目录授权权限
chown -R etcd.etcd /opt/etcd-v3.1.20/
chown -R etcd.etcd /data/etcd
chown -R etcd.etcd /data/logs/etcd-server/
创建一个etcd的脚本
/opt/etcd/etcd-server-startup.sh
chmod +x /opt/etcd/etcd-server-startup.sh
-------------------添加如下内容--------------------------
1 #!/bin/sh 2 ./etcd --name etcd-server-7-12 \ 3 --data-dir /data/etcd/etcd-server \ 4 --listen-peer-urls https://192.168.27.102:2380 \ 5 --listen-client-urls https://192.168.27.102:2379,http://127.0.0.1:2379 \ 6 --quota-backend-bytes 8000000000 \ 7 --initial-advertise-peer-urls https://192.168.27.102:2380 \ 8 --advertise-client-urls https://192.168.27.102:2379,http://127.0.0.1:2379 \ 9 --initial-cluster etcd-server-7-12=https://192.168.27.102:2380,etcd-server-7-21=https://192.168.27.103:2380,etcd-server-7-22=https://192.168.27.104:2380 \ 10 --ca-file ./certs/ca.pem \ 11 --cert-file ./certs/etcd-peer.pem \ 12 --key-file ./certs/etcd-peer-key.pem \ 13 --client-cert-auth \ 14 --trusted-ca-file ./certs/ca.pem \ 15 --peer-ca-file ./certs/ca.pem \ 16 --peer-cert-file ./certs/etcd-peer.pem \ 17 --peer-key-file ./certs/etcd-peer-key.pem \ 18 --peer-client-cert-auth \ 19 --peer-trusted-ca-file ./certs/ca.pem \ 20 --log-output stdout
# 安装一个辅助工具(用于让脚本自动运行,如果脚本停止自动启动)
yum install supervisor -y
systemctl start supervisord
systemctl enable supervisord
设置supervisor启动设置文件
vim /etc/supervisord.d/etcd-server.ini
-------------------添加下面内容------------------------
1 [program: etcd-server-7-12] 2 command=/opt/etcd/etcd-server-startup.sh 3 numprocs=1 4 directory=/opt/etcd 5 autostart=true 6 autorestart=true 7 startsecs=30 8 startretries=3 9 exitcodes=0,2 10 stopsignal=QUIT 11 stopwaitsecs=10 12 user=etcd 13 redirect_stderr=true 14 stdout_logfile=/data/logs/etcd-server/etcd.stdout.1og 15 stdout_logfile_maxbytes=64MB 16 stdout_logfile_backups=4 17 stdout_capture_maxbytes=1MB 18 stdout_events_enabled=false
开始操作supervisor
supervisorctl update
supervisorctl status
# 查看启动日志
tail -fn 200 /data/logs/etcd-server/etcd.stdout.1og
# 查看端口是否正常开启
sudo netstat -luntp |grep etcd
PS:3个节点都按照上面配置,注意标黄部分自己需要修改。
检查集群的健康状态
进入任意节点目录/opt/etcd/下,执行
./etcdctl cluster-health
./etcdctl member list # 通过这个命令可以查看到当前集群的leader
部署kube-apiserver集群
HDSS7-21(27.103)
HDSS7-22(27.104)
这里部署以HDSS7-21 为例,另外一台配置相同
v1.15.2 v1.18.5
tar xf kubernetes-server-linux-amd64-v1.18.5.tar.gz -C /opt
cd /opt
mv kubernetes-server-linux-amd64 kubernetes-v1.18.5
ln -s kubernetes-v1.18.5 kubernetes
清理二进制安装无用包(可选)
/opt/kubernets/kubernetes-src.tar.gz # go语言源码包
/opt/kubernetes/server/bin 下面所有tar包和_tag(docker镜像)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
2019-07-08 go 相关常用命令(updateing)
2019-07-08 python 环境常用指令(updating...)