虚拟机系统环境 centos 7.4的3.10.0(3.8.0以上即可)
准备五台虚拟机,ip分别为:
后面的主机名是没有意义的,是我之前做其他项目的时候起的名字,与此项目无关
hostnamectl set-hostname <主机名>
ip需要设置在虚拟机指定的网段里面
dns指向虚拟机网关地址
gateway指向虚拟机网关地址
#关闭 selinux
setenforce 0
#永久关闭
vim /etc/selinux/config
#将 SELINUX-enforcing 修改成 SELINUX-disabled
验证方式
#输出结果为Disabled就位关闭
getenforce
systemctl stop firewalld
yum install -y epel-release
yum install -y wget net-tools telnet tree nmap sysstat lrzsz dos2unix bind-utils vim less
这里选择ip为192.168.252.11的机器安装
yum install bind -y
vim /etc/named.conf
这个文件要特别小心,最好先备份一下再改,bind的语法非常严格,分号和空格非常容易错,一定要注意
options {
/* 监听到本机的地址 */
listen-on port 53 { 192.168.252.11; };
/* listen-on-v6 port 53 { ::1; }; */
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
/* 那些服务器可以查询 从localhost改成any */
allow-query { any; };
/* 添加一个配置,设置上级网关的配置 */
forwarders { 192.168.252.2; };
/*
- If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
- If you are building a RECURSIVE (caching) DNS server, you need to enable
recursion.
- If your recursive DNS server has a public IP address, you MUST enable access
control to limit queries to your legitimate users. Failing to do so will
cause your server to become part of large scale DNS amplification
attacks. Implementing BCP38 within your network would greatly
reduce such attack surface
*/
/* 使用递归的方式查询dns */
recursion yes;
/* 这里关闭掉 */
dnssec-enable no;
dnssec-validation no;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.root.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
检测配置文件是否正确
named-checkconf
vim /etc/named.rfc1912.zones
在文件的最后添加两个域
zone "host.com" IN {
type master;
file "host.com.zone";
allow-update { 192.168.252.11; };
};
zone "od.com" IN {
type master;
file "od.com.zone";
allow-update { 192.168.252.11; };
};
编辑host区域数据文件
vim /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 ( 1day)
)
NS dns.host.com.
$TTL 60 ; 1 minute
dns A 192.168.252.11
master1 A 192.168.252.11
worker1 A 192.168.252.12
worker2 A 192.168.252.13
master2 A 192.168.252.14
worker3 A 192.168.252.15
配置od的区域数据文件
vim /var/named/od.com.zone
文件中添加
$ORIGIN od.com.
$TTL 600 ; 10 minutes
@ IN SOA dns.od.com. dnsadmin.od.com. (
2020071002 ; serial
10800 ; refresh ( 3 hours)
900 ; retry ( 15 minutes)
604800 ; expire ( 1week )
86400 ; minimum ( 1day )
)
NS dns.od.com.
$TTL 60 ; 1 minute
dns A 192.168.252.11
harbor A 192.168.252.14
再次检验一下配置文件是否正确
named-checkconf
systemctl start named
dig -t A master1.host.com @192.168.252.11 +short
有时候不叫ifcfg-eth0,更加实际情况自行修改
vim /etc/sysconfig/network-scripts/ifcfg-eth0
添加DNS解析
DNS1=192.168.252.11
保存并重启network服务
systemctl restart network
在resolv.conf下添加短域名的匹配
vim /etc/resolv.conf
在最上面添加一行
search host.com
同ping命令检测网络连接是否正常
#测试外网连接
ping baidu.com
#测试内网连接
ping master1
最后需要修改以下物理机(安装虚拟机的物理机),将他配置到DNS中,因为需要通过物理机进行域名访问
控制面板 -> 网络和Internet -> 网络连接 -> VMnet8 -> Internet协议版本4 -> 首选DNS服务器 -> 填写192.168.252.11
如果修改VMnet8没有用,就需要修改本地网络(名字不交本地网络,看那个是连接网络就改哪个)
注意:这里的配置有可能会影响到其他虚拟机的使用,当不需要的时候需要将其删除
#测试是否能通过域名连接上虚拟机,这里需要使用全域名
ping master1.host.com
在master2上下载cfssl
#下载
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssl-json
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfo
#赋予执行权限
chmod u+x /usr/local/bin/cfssl*
mkdir /opt/certs
vim /opt/certs/ca-csr.json
复制的时候需要把注释删掉,不然会失效
{
#CA机构的名称
"CN": "OldboyEdu",
"hosts": [
],
#加密算法
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
#国家
"C": "CN",
#省
"ST": "beijing",
#地区城市
"L": "beijing",
#组织名称
"O": "od",
#机构单位名称,公司部门
"OU": "ops"
}
],
"ca": {
#有效时间,默认为1年
"expiry": "175200h"
}
}
cfssl gencert -initca ca-csr.json | cfssl-json -bare ca
执行完之后会生成3个文件
在192.168.252.12、192.168.252.13、192.168.252.14、192.168.252.15上安装docker
#下载安装脚本
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装docker
yum install -y docker-ce
#创建docker工作目录
mkdir -p /data/docker
#创建配置文件目录
mkdir /etc/docker
#创建配置文件
vim /etc/docker/daemon.json
不安全的registry中增加了harbor地址
各个机器上bip网段不一致,bip中间两段与宿主机最后两段相同,目的是方便定位问题
复制的时候需要把注释删掉,不然会失效
{
"graph": "/data/docker",
"storage-driver": "overlay2",
"insecure-registries": ["registry.access.redhat.com","quay.io","harbor.od.com"],
"registry-mirrors": ["https://registry.docker-cn.com"],
#这个字段每台docker上都不一样,我分别设置为了172.7.11.1/24、172.7.12.1/24、172.7.15.1/24
"bip": "172.7.11.1/24",
"exec-opts": ["native.cgroupdriver=systemd"],
"live-restore": true
}
启动docker
systemctl start docker
在192.168.252.14上安装harbor
下载地址:https://github.com/goharbor/harbor/tags
下载版本:harbor-offline-installer-v1.8.3.tgz
tar -zxvf harbor-offline-installer-v1.8.3.tgz -C /opt/
#便于以后的升级
#把harbor改下名字
mv /opt/harbor /opt/harbor-v1.8.3
#做一个软连接
ln -s /opt/harbor-v1.8.3/ /opt/harbor
vim /opt/harbor/harbor.yml
将下面几个属性修改成对应的值,其他不变
hostname = harbor.od.com
http:
port: 180
#默认管理员密码
harbor_admin_password: Harbor12345
data_volume: /data/harbor
log:
level: info
rotate_count: 50
rotate_size: 200M
location: /data/harbor/logs
常见需要的文件夹
mkdir -p /data/harbor
mkdir -p /data/harbor/logs
harbor是依赖于docker-compose的
yum install docker-compose -y
执行harbor目录下的install.sh
/opt/harbor/install.sh
查看启动的容器
docker-compose ps
docker ps -a
yum install nginx -y
修改nginx的配置文件
vim /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 -t
启动nginx
systemctl start nginx
systemctl enable nginx
测试
curl harbor.od.com
访问地址:http://harbor.od.com
需要配置好物理机的DNS 具体步骤看上面
用户名:admin
密码:Harbor12345
项目名:public
访问级别:公开
docker pull nginx:1.7.9
查看这个镜像
docker images | grep 1.7.9
给这个镜像加一个tag
docker tag 84581e99d807 harbor.od.com/public/nginx:v1.7.9
登录harbor
docker login harbor.od.com
推送镜像到harbor中
docker push harbor.od.com/public/nginx:v1.7.9
在192.168.252.12、192.168.252.13、192.168.252.15上安装etcd
在192.168.252.14服务上签发证书
vim /opt/certs/ca-config.json
{
"signing": {
"default": {
"expiry": "175200h"
},
"profiles": {
"server": {
"expiry": "175200h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "175200h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
},
"peer": {
"expiry": "175200h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
vim etcd-peer-csr.json
重点在hosts上,将所有可能的etcd服务器添加到host列表,不能使用网段,新增etcd服务器需要重新签发证书
{
"CN": "k8s-etcd",
"hosts": [
"192.168.252.11",
"192.168.252.12",
"192.168.252.13",
"192.168.252.14",
"192.168.252.15"],
"key": {
"algo": "rsa",
"size": 2048 },
"names": [
{
"C": "CN",
"ST": "beijing",
"L": "beijing",
"O": "od",
"OU": "ops" }
]
}
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer etcd-peer-csr.json | cfssl-json -bare etcd-peer
在192.168.252.12、192.168.252.13、192.168.252.15上安装etcd
useradd -s /sbin/nologin -M etcd
下载地址:https://github.com/etcd-io/etcd/
使用版本:etcd-v3.1.20-linux-amd64.tar.gz
tar -zxvf etcd-v3.1.20-linux-amd64.tar.gz -C /opt/
#重命名
mv /opt/etcd-v3.1.20-linux-amd64 /opt/etcd-v3.1.20
#做软连接
ln -s /opt/etcd-v3.1.20 /opt/etcd
创建文件夹
mkdir -p /opt/etcd/certs /data/etcd /data/logs/etcd-server
将证书拷贝到/opt/etcd/certs目录下
scp master2:/opt/certs/ca.pem /opt/etcd/certs
scp master2:/opt/certs/etcd-peer.pem /opt/etcd/certs
scp master2:/opt/certs/etcd-peer-key.pem /opt/etcd/certs
vim /opt/etcd/etcd-server-startup.sh
listen-peer-urls etcd节点之间通信端口
listen-client-urls 客户端与etcd通信端口
quota-backend-bytes 配额大小
需要修改的参数:name,listen-peer-urls,listen-client-urls,initial-advertise-peer-urls
#!/bin/sh
/opt/etcd/etcd --name etcd-server-252-12 \
--data-dir /data/etcd/etcd-server \
--listen-peer-urls https://192.168.252.12:2380 \
--listen-client-urls https://192.168.252.12:2379,http://127.0.0.1:2379 \
--quota-backend-bytes 8000000000 \
--initial-advertise-peer-urls https://192.168.252.12:2380 \
--advertise-client-urls https://192.168.252.12:2379,http://127.0.0.1:2379 \
--initial-cluster etcd-server-252-12=https://192.168.252.12:2380,etcd-server-252-13=https://192.168.252.13:2380,etcd-server-252-15=https://192.168.252.15:2380 \
--ca-file ./certs/ca.pem \
--cert-file ./certs/etcd-peer.pem \
--key-file ./certs/etcd-peer-key.pem \
--client-cert-auth \
--trusted-ca-file ./certs/ca.pem \
--peer-ca-file ./certs/ca.pem \
--peer-cert-file ./certs/etcd-peer.pem \
--peer-key-file ./certs/etcd-peer-key.pem \
--peer-client-cert-auth \
--peer-trusted-ca-file ./certs/ca.pem \
--log-output stdout
chmod u+x /opt/etcd/etcd-server-startup.sh
#将文件所有权赋予 etcd这个用户
chown -R etcd.etcd /opt/etcd/ /data/etcd /data/logs/etcd-server
安装supervisor
yum install supervisor -y
启动supervisord
systemctl start supervisord
systemctl enable supervisord
创建supervisord的启动文件
vim /etc/supervisord.d/etcd-server.ini
注意修改program的名字
[program:etcd-server-252-12]
command=/opt/etcd/etcd-server-startup.sh ; the program (relative uses PATH, can take args)
numprocs=1 ; number of processes copies to start (def 1)
directory=/opt/etcd ; directory to cwd to before exec (def no cwd)
autostart=true ; start at supervisord start (default: true)
autorestart=true ; retstart at unexpected quit (default: true)
startsecs=30 ; number of secs prog must stay running (def. 1)
startretries=3 ; max # of serial start failures (default 3)
exitcodes=0,2 ; 'expected' exit codes for process (default 0,2)
stopsignal=QUIT ; signal used to kill process (default TERM)
stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
user=etcd ; setuid to this UNIX account to run the program
redirect_stderr=true ; redirect proc stderr to stdout (default false)
stdout_logfile=/data/logs/etcd-server/etcd.stdout.log ; stdout log path, NONE for none; default AUTO
stdout_logfile_maxbytes=64MB ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=5 ; # of stdout logfile backups (default 10)
stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
stdout_events_enabled=false ; emit events on stdout writes (default false)
刷新supervisord的配置文件
supervisorctl update
查看supervisord的状态
supervisorctl status
查看etcd的网络状态,必须监听了2379和2380的端口才算启动成功(应该会出现3条信息)
netstat -luntp | grep etcd
查看etcd成员列表
/opt/etcd/etcdctl member list
查看etcd集群健康
/opt/etcd/etcdctl cluster-health
下载地址:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.15.md#downloads-for-v1152
下载版本:v1.15.2
页面往下翻,找到“Downloads for v1.15.2”-> “Server Binaries” -> “kubernetes-server-linux-amd64.tar.gz”
或者直接访问https://dl.k8s.io/v1.15.2/kubernetes-server-linux-amd64.tar.gz
下载
将下载好的文件上传到192.168.252.12、192.168.252.13上,然后解药到/opt下
tar -zxvf kubernetes-server-linux-amd64.tar.gz -C /opt
修改包名
mv /opt/kubernetes/ /opt/kubernetes-v1.15.2
创建软连接
ln -s /opt/kubernetes-v1.15.2 /opt/kubernetes
删除一些不需要的tar包,和一些docker的tag配置
rm -f /opt/kubernetes/kubernetes-src.tar.gz
rm -f /opt/kubernetes/server/bin/*.tar
rm -f /opt/kubernetes/server/bin/*_tag
在192.168.252.14服务上签发证书
vim /opt/certs/client-csr.json
{
"CN": "k8s-node",
"hosts": [
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "beijing",
"L": "beijing",
"O": "od",
"OU": "ops"
}
]
}
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client-csr.json | cfssl-json -bare client
vim /opt/certs/apiserver-csr.json
{
"CN": "k8s-apiserver",
"hosts": [
"127.0.0.1",
"192.168.0.1",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local",
"192.168.252.11",
"192.168.252.12",
"192.168.252.13",
"192.168.252.14",
"192.168.252.15",
"192.168.252.20"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "beijing",
"L": "beijing",
"O": "od",
"OU": "ops"
}
]
}
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server apiserver-csr.json | cfssl-json -bare apiserver
192.168.252.12和192.168.252.13都需要这些证书
创建存放证书的目录
mkdir -p /opt/kubernetes/server/bin/certs
scp master2:/opt/certs/ca.pem /opt/kubernetes/server/bin/certs
scp master2:/opt/certs/ca-key.pem /opt/kubernetes/server/bin/certs
scp master2:/opt/certs/client.pem /opt/kubernetes/server/bin/certs
scp master2:/opt/certs/client-key.pem /opt/kubernetes/server/bin/certs
scp master2:/opt/certs/apiserver.pem /opt/kubernetes/server/bin/certs
scp master2:/opt/certs/apiserver-key.pem /opt/kubernetes/server/bin/certs
mkdir -p /opt/kubernetes/server/bin/conf
vim /opt/kubernetes/server/bin/conf/audit.yaml
打开文件后,设置 :set paste,避免自动缩进
apiVersion: audit.k8s.io/v1beta1 # This is required.
kind: Policy
# Don't generate audit events for all requests in RequestReceived stage.
omitStages:
- "RequestReceived"
rules:
# Log pod changes at RequestResponse level
- level: RequestResponse
resources:
- group: ""
# Resource "pods" doesn't match requests to any subresource of pods,
# which is consistent with the RBAC policy.
resources: ["pods"]
# Log "pods/log", "pods/status" at Metadata level
- level: Metadata
resources:
- group: ""
resources: ["pods/log", "pods/status"]
# Don't log requests to a configmap called "controller-leader"
- level: None
resources:
- group: ""
resources: ["configmaps"]
resourceNames: ["controller-leader"]
# Don't log watch requests by the "system:kube-proxy" on endpoints or services
- level: None
users: ["system:kube-proxy"]
verbs: ["watch"]
resources:
- group: "" # core API group
resources: ["endpoints", "services"]
# Don't log authenticated requests to certain non-resource URL paths.
- level: None
userGroups: ["system:authenticated"]
nonResourceURLs:
- "/api*" # Wildcard matching.
- "/version"
# Log the request body of configmap changes in kube-system.
- level: Request
resources:
- group: "" # core API group
resources: ["configmaps"]
# This rule only applies to resources in the "kube-system" namespace.
# The empty string "" can be used to select non-namespaced resources.
namespaces: ["kube-system"]
# Log configmap and secret changes in all other namespaces at the Metadata level.
- level: Metadata
resources:
- group: "" # core API group
resources: ["secrets", "configmaps"]
# Log all other resources in core and extensions at the Request level.
- level: Request
resources:
- group: "" # core API group
- group: "extensions" # Version of group should NOT be included.
# A catch-all rule to log all other requests at the Metadata level.
- level: Metadata
# Long-running requests like watches that fall under this rule will not
# generate an audit event in RequestReceived.
omitStages:
- "RequestReceived"
vim /opt/kubernetes/server/bin/kube-apiserver-startup.sh
#!/bin/bash
/opt/kubernetes/server/bin/kube-apiserver \
--apiserver-count 2 \
--audit-log-path /data/logs/kubernetes/kube-apiserver/audit-log \
--audit-policy-file ./conf/audit.yaml \
--authorization-mode RBAC \
--client-ca-file ./certs/ca.pem \
--requestheader-client-ca-file ./certs/ca.pem \
--enable-admission-plugins NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota \
--etcd-cafile ./certs/ca.pem \
--etcd-certfile ./certs/client.pem \
--etcd-keyfile ./certs/client-key.pem \
--etcd-servers https://192.168.252.12:2379,https://192.168.252.13:2379,https://192.168.252.15:2379 \
--service-account-key-file ./certs/ca-key.pem \
--service-cluster-ip-range 192.168.0.0/16 \
--service-node-port-range 3000-29999 \
--target-ram-mb=1024 \
--kubelet-client-certificate ./certs/client.pem \
--kubelet-client-key ./certs/client-key.pem \
--log-dir /data/logs/kubernetes/kube-apiserver \
--tls-cert-file ./certs/apiserver.pem \
--tls-private-key-file ./certs/apiserver-key.pem \
--v 2
添加执行权限
chmod +x /opt/kubernetes/server/bin/kube-apiserver-startup.sh
创建需要的文件夹
mkdir -p /data/logs/kubernetes/kube-apiserver/audit-log
vim /etc/supervisord.d/kube-apiserver.ini
这个文件每台机器上略有不同
[program:kube-apiserver-252-12]
command=/opt/kubernetes/server/bin/kube-apiserver-startup.sh
numprocs=1
directory=/opt/kubernetes/server/bin
autostart=true
autorestart=true
startsecs=30
startretries=3
exitcodes=0,2
stopsignal=QUIT
stopwaitsecs=10
user=root
redirect_stderr=true
stdout_logfile=/data/logs/kubernetes/kube-apiserver/apiserver.stdout.log
stdout_logfile_maxbytes=64MB
stdout_logfile_backups=5
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
刷新supervisorctl update
supervisorctl update
查看状态
supervisorctl status
启停apiserver
supervisorctl start kube-apiserver-252-12
supervisorctl stop kube-apiserver-252-12
supervisorctl restart kube-apiserver-252-12
supervisorctl status kube-apiserver-252-12
查看进程
netstat -lntp|grep kube-api
ps -aux|grep kube-apiserver|grep -v grep
在服务器192.168.252.11和192.168.252.15上安装nginx
yum install nginx -y
修改配置文件
vim /etc/nginx/nginx.conf
加载文件最后,别加载任何括号里面
stream {
upstream kube-apiserver {
server 192.168.252.12:6443 max_fails=3 fail_timeout=30s;
server 192.168.252.13:6443 max_fails=3 fail_timeout=30s;
}
server {
listen 7443;
proxy_connect_timeout 2s;
proxy_timeout 900s;
proxy_pass kube-apiserver;
}
}
检测配置文件是否正确
nginx -t
启动nginx
systemctl start nginx
systemctl enable nginx
在服务器192.168.252.11和192.168.252.15上安装keepalived
yum install keepalived -y
vim /etc/keepalived/check_port.sh
#!/bin/bash
if [ $# -eq 1 ] && [[ $1 =~ ^[0-9]+ ]];then
[ $(netstat -lntp|grep ":$1 " |wc -l) -eq 0 ] && echo "[ERROR] nginx may be not running!" && exit 1 || exit 0
else
echo "[ERROR] need one port!"
exit 1
fi
或者使用这个脚本,二选一即可
#!/bin/bash
CHK_PORT=$1
if [ -n "$CHK_PORT"];then
PORT_PROCESS=`ss -lnt | grep $CHK_PORT|wc -l`
if [ $PORT_PROCESS -eq 0 ];then
echo "Port $CHK_PORT is not used,end"
exit 1
fi
else
echo "Check port cant be empty!"
fi
赋予执行权限
chmod +x /etc/keepalived/check_port.sh
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id 192.168.252.11
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_port.sh 7443"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 251
priority 100
advert_int 1
mcast_src_ip 192.168.252.11
nopreempt
authentication {
auth_type PASS
auth_pass 11111111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.252.20
}
}
/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id 192.168.252.15
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_port.sh 7443"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 251
mcast_src_ip 192.168.252.15
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 11111111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.252.20
}
}
systemctl start keepalived
systemctl enable keepalived
检查有没有虚拟出vip
ip add
查看ens33是否存在ip:192.168.252.20
当主服务失效后,vip会漂移到从服务,并且不会主动的回到主服务上,如果需要回来需要人工确认好之后,重启主和从服务上的keepalived
在192.168.252.12、192.168.252.13上部署
vim /opt/kubernetes/server/bin/kube-controller-manager-startup.sh
#!/bin/sh
/opt/kubernetes/server/bin/kube-controller-manager \
--cluster-cidr 172.7.0.0/16 \
--leader-elect true \
--log-dir /data/logs/kubernetes/kube-controller-manager \
--master http://127.0.0.1:8080 \
--service-account-private-key-file ./certs/ca-key.pem \
--service-cluster-ip-range 192.168.0.0/16 \
--root-ca-file ./certs/ca.pem \
--v 2
赋予执行权限
chmod u+x /opt/kubernetes/server/bin/kube-controller-manager-startup.sh
创建日志目录
mkdir -p /data/logs/kubernetes/kube-controller-manager
vim /etc/supervisord.d/kube-conntroller-manager.ini
注意修改服务的名称
[program:kube-controller-manager-252-12]
command=/opt/kubernetes/server/bin/kube-controller-manager-startup.sh ; the program (relative uses PATH, can take args)
numprocs=1 ; number of processes copies to start (def 1)
directory=/opt/kubernetes/server/bin ; directory to cwd to before exec (def no cwd)
autostart=true ; start at supervisord start (default: true)
autorestart=true ; retstart at unexpected quit (default: true)
startsecs=30 ; number of secs prog must stay running (def. 1)
startretries=3 ; max # of serial start failures (default 3)
exitcodes=0,2 ; 'expected' exit codes for process (default 0,2)
stopsignal=QUIT ; signal used to kill process (default TERM)
stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
user=root ; setuid to this UNIX account to run the program
redirect_stderr=true ; redirect proc stderr to stdout (default false)
stdout_logfile=/data/logs/kubernetes/kube-controller-manager/controller.stdout.log ; stderr log path, NONE for none; default AUTO
stdout_logfile_maxbytes=64MB ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=4 ; # of stdout logfile backups (default 10)
stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
stdout_events_enabled=false
刷新supervisor
supervisorctl update
vim /opt/kubernetes/server/bin/kube-scheduler-startup.sh
#!/bin/sh
/opt/kubernetes/server/bin/kube-scheduler \
--leader-elect \
--log-dir /data/logs/kubernetes/kube-scheduler \
--master http://127.0.0.1:8080 \
--v 2
赋予运行权限
chmod u+x /opt/kubernetes/server/bin/kube-scheduler-startup.sh
创建日志目录
mkdir -p /data/logs/kubernetes/kube-scheduler
vim /etc/supervisord.d/kube-scheduler.ini
注意修改服务的名称
[program:kube-scheduler-252-12]
command=/opt/kubernetes/server/bin/kube-scheduler-startup.sh
numprocs=1
directory=/opt/kubernetes/server/bin
autostart=true
autorestart=true
startsecs=30
startretries=3
exitcodes=0,2
stopsignal=QUIT
stopwaitsecs=10
user=root
redirect_stderr=true
stdout_logfile=/data/logs/kubernetes/kube-scheduler/scheduler.stdout.log
stdout_logfile_maxbytes=64MB
stdout_logfile_backups=4
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
刷新supervisor
supervisorctl update
ln -s /opt/kubernetes/server/bin/kubectl /usr/bin/kubectl
kubectl get cs
在192.168.252.12、192.168.252.13上部署
在192.168.252.14上签发证书
vim /opt/certs/kubelet-csr.json
将所有可能的kubelet机器IP添加到hosts中
{
"CN": "k8s-kubelet",
"hosts": [
"127.0.0.1",
"192.168.252.11",
"192.168.252.12",
"192.168.252.13",
"192.168.252.14",
"192.168.252.15",
"192.168.252.16",
"192.168.252.17",
"192.168.252.18",
"192.168.252.19"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "beijing",
"L": "beijing",
"O": "od",
"OU": "ops"
}
]
}
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server kubelet-csr.json | cfssl-json -bare kubelet
192.168.252.12和192.168.252.13上
scp master2:/opt/certs/kubelet.pem /opt/kubernetes/server/bin/certs
scp master2:/opt/certs/kubelet-key.pem /opt/kubernetes/server/bin/certs
创建需要连接的集群信息,可以创建多个k8s集群信息
–server:填写keepalived的vip
–kubeconfig:配置文件成的位置所在
kubectl config set-cluster myk8s \
--certificate-authority=/opt/kubernetes/server/bin/certs/ca.pem \
--embed-certs=true \
--server=https://192.168.252.20:7443 \
--kubeconfig=/opt/kubernetes/server/bin/conf/kubelet.kubeconfig
创建用户账号,即用户登陆使用的客户端私有和证书,可以创建多个证书
kubectl config set-credentials k8s-node \
--client-certificate=/opt/kubernetes/server/bin/certs/client.pem \
--client-key=/opt/kubernetes/server/bin/certs/client-key.pem \
--embed-certs=true \
--kubeconfig=/opt/kubernetes/server/bin/conf/kubelet.kubeconfig
设置context,即确定账号和集群对应关系
kubectl config set-context myk8s-context \
--cluster=myk8s \
--user=k8s-node \
--kubeconfig=/opt/kubernetes/server/bin/conf/kubelet.kubeconfig
设置当前使用哪个context
kubectl config use-context myk8s-context \
--kubeconfig=/opt/kubernetes/server/bin/conf/kubelet.kubeconfig
其他的节点机器可以直接把/opt/kubernetes/server/bin/conf/kubelet.kubeconfig这个文件拷贝到对应的文件中
scp worker1.host.com:/opt/kubernetes/server/bin/conf/kubelet.kubeconfig /opt/kubernetes/server/bin/conf
此步骤只需要在任意一个主节点上执行即可,会被存到etcd中,这样所有的主节点都会知道了
授权 k8s-node 用户绑定集群角色 system:node ,让 k8s-node 成为具备运算节点的权限
vim /opt/kubernetes/server/bin/conf/k8s-node.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: k8s-node
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:node
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: k8s-node
kubectl create -f /opt/kubernetes/server/bin/conf/k8s-node.yaml
kubectl get clusterrolebinding k8s-node
在192.168.252.14上操作
docker pull kubernetes/pause
打上标签
docker image tag kubernetes/pause:latest harbor.od.com/public/pause:latest
登录harbor
docker login -u admin harbor.od.com
推送到harbor
docker image push harbor.od.com/public/pause:latest
192.168.252.12和192.168.252.13上
vim /opt/kubernetes/server/bin/kubelet-startup.sh
注意修改–hostname-override属性
#!/bin/sh
/opt/kubernetes/server/bin/kubelet \
--anonymous-auth=false \
--cgroup-driver systemd \
--cluster-dns 192.168.0.2 \
--cluster-domain cluster.local \
--runtime-cgroups=/systemd/system.slice \
--kubelet-cgroups=/systemd/system.slice \
--fail-swap-on="false" \
--client-ca-file ./certs/ca.pem \
--tls-cert-file ./certs/kubelet.pem \
--tls-private-key-file ./certs/kubelet-key.pem \
--hostname-override worker1.host.com \
--image-gc-high-threshold 20 \
--image-gc-low-threshold 10 \
--kubeconfig ./conf/kubelet.kubeconfig \
--log-dir /data/logs/kubernetes/kube-kubelet \
--pod-infra-container-image harbor.od.com/public/pause:latest \
--root-dir /data/kubelet
赋予执行权限
chmod u+x /opt/kubernetes/server/bin/kubelet-startup.sh
创建需要的文件夹
mkdir -p /data/logs/kubernetes/kube-kubelet /data/kubelet
vim /etc/supervisord.d/kube-kubelet.ini
注意修改服务名
[program:kube-kubelet-252-12]
command=/opt/kubernetes/server/bin/kubelet-startup.sh
numprocs=1
directory=/opt/kubernetes/server/bin
autostart=true
autorestart=true
startsecs=30
startretries=3
exitcodes=0,2
stopsignal=QUIT
stopwaitsecs=10
user=root
redirect_stderr=true
stdout_logfile=/data/logs/kubernetes/kube-kubelet/kubelet.stdout.log
stdout_logfile_maxbytes=64MB
stdout_logfile_backups=5
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
刷新supervisor
supervisorctl update
查看状态
supervisorctl status
在主服务的机器上查看节点是否加入到集群中了
kubectl get nodes
给节点添加标签
kubectl label node worker1.host.com node-role.kubernetes.io/master=
kubectl label node worker1.host.com node-role.kubernetes.io/node=
kubectl label node worker2.host.com node-role.kubernetes.io/master=
kubectl label node worker2.host.com node-role.kubernetes.io/node=
在192.168.252.14上签发证书
vim /opt/certs/kube-proxy-client-csr.json
{
"CN": "system:kube-proxy",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "beijing",
"L": "beijing",
"O": "od",
"OU": "ops"
}
]
}
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kube-proxy-client-csr.json |cfssl-json -bare kube-proxy-client
192.168.252.12和192.168.252.13上
scp master2:/opt/certs/kube-proxy-client.pem /opt/kubernetes/server/bin/certs
scp master2:/opt/certs/kube-proxy-client-key.pem /opt/kubernetes/server/bin/certs
192.168.252.12和192.168.252.13上
kubectl config set-cluster myk8s \
--certificate-authority=/opt/kubernetes/server/bin/certs/ca.pem \
--embed-certs=true \
--server=https://192.168.252.20:7443 \
--kubeconfig=/opt/kubernetes/server/bin/conf/kube-proxy.kubeconfig
kubectl config set-credentials kube-proxy \
--client-certificate=/opt/kubernetes/server/bin/certs/kube-proxy-client.pem \
--client-key=/opt/kubernetes/server/bin/certs/kube-proxy-client-key.pem \
--embed-certs=true \
--kubeconfig=/opt/kubernetes/server/bin/conf/kube-proxy.kubeconfig
这里user的值需要和证书的CN的后半段对上
kubectl config set-context myk8s-context \
--cluster=myk8s \
--user=kube-proxy \
--kubeconfig=/opt/kubernetes/server/bin/conf/kube-proxy.kubeconfig
kubectl config use-context myk8s-context \
--kubeconfig=/opt/kubernetes/server/bin/conf/kube-proxy.kubeconfig
192.168.252.13可以直接把生成的文件拷贝过来
scp worker1.host.com:/opt/kubernetes/server/bin/conf/kube-proxy.kubeconfig /opt/kubernetes/server/bin/conf
192.168.252.12和192.168.252.13上
cd ~
vim /root/ipvs.sh
kube-proxy 共有3种流量调度模式,分别是 namespace,iptables,ipvs,其中ipvs性能最好。
#!/bin/bash
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");
do
echo $i;
/sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;
done
赋予执行权限啊
chmod +x ipvs.sh
执行脚本单独
./ipvs.sh
查看ipvs模块是否被启动
lsmod | grep ip_vs
192.168.252.12和192.168.252.13上
vim /opt/kubernetes/server/bin/kube-proxy-startup.sh
注意修改–hostname-override属性
#!/bin/sh
/opt/kubernetes/server/bin/kube-proxy \
--cluster-cidr 172.7.0.0/16 \
--hostname-override worker1.host.com \
--proxy-mode=ipvs \
--ipvs-scheduler=nq \
--kubeconfig /opt/kubernetes/server/bin/conf/kube-proxy.kubeconfig
赋予执行权限
chmod +x /opt/kubernetes/server/bin/kube-proxy-startup.sh
创建目录
mkdir -p /data/logs/kubernetes/kube-proxy
vim /etc/supervisord.d/kube-proxy.ini
注意修改服务名
[program:kube-proxy-252-12]
command=/opt/kubernetes/server/bin/kube-proxy-startup.sh
numprocs=1
directory=/opt/kubernetes/server/bin
autostart=true
autorestart=true
startsecs=30
startretries=3
exitcodes=0,2
stopsignal=QUIT
stopwaitsecs=10
user=root
redirect_stderr=true
stdout_logfile=/data/logs/kubernetes/kube-proxy/proxy.stdout.log
stdout_logfile_maxbytes=64MB
stdout_logfile_backups=5
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
刷新supervisor
supervisorctl update
查看状态
supervisorctl status
安装 ipvsadm
yum install -y ipvsadm
查看ipvs的指向
ipvsadm -Ln
结果如下,192.168.0.1:443 通过nq算法指向 192.168.252.12:6443、192.168.252.13:6443
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.1:443 nq
-> 192.168.252.12:6443 Masq 1 0 0
-> 192.168.252.13:6443 Masq 1 0 0
查看k8s的svc
kubectl get svc
在对应的服务器上尝试访问docker的网络,返回200 ok即可,如果失败则无法通讯
#192.168.252.11上访问
curl -I 172.7.11.1
#192.168.252.12上访问
curl -I 172.7.12.1
缺少网络插件,无法跨节点通信
在192.168.252.12、192.168.252.13任意一个工作节点上
vim /root/nginx-ds.yaml
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: nginx-ds
spec:
template:
metadata:
labels:
app: nginx-ds
spec:
containers:
- name: my-nginx
image: harbor.od.com/public/nginx:v1.7.9
ports:
- containerPort: 80
kubectl create -f nginx-ds.yaml
查看k8s pods
kubectl get pods
kubectl get pods -o wide
在对应的服务器上尝试访问docker的网络
#192.168.252.11上访问
curl 172.7.11.2
#192.168.252.12上访问
curl 172.7.12.2
但是依旧无法相互交互