现在k8s版本更新比较快,我这里呢选用的是k8s1.15版本部署,选择一个比较稳定的版本

我这里使用的是脚本部署,脚本我会放到百度云盘上面供大家使用
地址如下:
链接:https://pan.baidu.com/s/10cGnKXjzJn9i6IHjq50m9g
提取码:ph4h

接下来开始
首先呢需要机器,最少2C,2G ,另外机器要关闭swap分区,防火墙,selinux,以及开启k8s的路由转发

环境分配:
10.20.2.23 master
10.20.2.77 node1
10.20.2.116 node2

这个是K8S包下载地址:
https://kubernetes.io/docs/setup/release/notes/

一、初始化服务器

systemctl stop firewalld && systemctl disable firewalld
setenforce 0
vi /etc/selinux/config
SELINUX=disabled

关闭Swap
swapoff -a && sysctl -w vm.swappiness=0
vi /etc/fstab
#UUID=7bff6243-324c-4587-b550-55dc34018ebf swap swap defaults 0 0

设置Docker所需参数
cat << EOF | tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf
————————————————
报错提示不存在的话 安装这个模块

modprobe br_netfilter

安装 Docker
wget  https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
mv docker-ce.repo  /etc/yum.repos.d/
yum install docker-ce -y
systemctl start docker && systemctl enable docker
————————————————
上面基本需要的环境已经配置完成
接下来开始进入正题

配置证书:
下载证书文件
使用cfssl来生成自签证书,先下载cfssl工具:
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo


1创建证书目录
mkdir -p/k8s/k8s-cert
Mkdir /k8s/etcd-cert

使用脚本部署
mv etcd-cert.sh /k8s/etcd-cert
脚本内容
cat etcd-cert.sh

cat > ca-config.json <{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"www": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF

cat > ca-csr.json <{
"CN": "etcd CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing"
}
]
}
EOF

cfssl gencert -initca ca-csr.json | cfssljson -bare ca -

#-----------------------

cat > server-csr.json <{
"CN": "etcd",
"hosts": [
"10.20.2.23",
"10.20.2.77",
"10.20.2.116"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
EOF

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server

部署etcd
创建目录放置软件包

mkdir soft

mkdir /opt/etcd/{cfg,bin,ssl} -p

开始部署etcd

先拷贝证书到etcd的ssl目录
scp *.pem /opt/etcd/ssl/


!!!!!!!!!启动[这里使用的是脚本


已经启动了但是在链接其他的2个机器
接下来启动另外2个机器
这里直接复制


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

scp /usr/lib/systemd/system/etcd.service root@k8s-node1:/usr/lib/systemd/system
scp /usr/lib/systemd/system/etcd.service root@k8s-node2:/usr/lib/systemd/system
然后修改node1和node2上面的ip为本地ip,应为是拷贝过来的


验证效果
/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://10.20.2.23:2379,https://10.20.2.77:2379,https://10.20.2.116:2379" cluster-health

创建flannel
分配一个网络段
/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://10.20.2.23:2379,https://10.20.2.77:2379,https://10.20.2.116:2379" set /coreos.com/network/config '{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}'

查看一下

Node所有节点下创建工作目录
mkdir /opt/kubernetes/{bin,ssl,cfg} -p
mv flanneld mk-docker-opts.sh /opt/kubernetes/bin/



FLANNEL_OPTIONS="--etcd-endpoints=https://10.20.2.23:2379,https://10.20.2.77:2379,https://10.20.2.116:2379 -etcd-cafile=/opt/etcd/ssl/ca.pem -etcd-certfile=/opt/etcd/ssl/server.pem -etcd-keyfile=/opt/etcd/ssl/server-key.pem"
查看flanneld的system文件

Docker的文件也要修改主要2行

验证:

以上是一个node节点,所有的都一样

验证node之间容器是否通信

查看路由信息
/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://10.20.2.23:2379,https://10.20.2.77:2379,https://10.20.2.116:2379" ls /coreos.com/network



以上属于etcd和flanneld的部署

下面部署k8s组件在master节点
Apiserver
Controller-manager
Scheduler

解压包

创建目录
mkdir -p /opt/kubernetes/{bin,ssl,cfg}

移动
cp kube-apiserver kube-controller-manager kube-scheduler /opt/kubernetes/bin/

启动api-server脚本启动不了

创建api-server的日志目录
mkdir /opt/kubernetes/logs


启动发现日志中没有配置ca证书


有点着急先创建证书
创建证书和tokev文件
创建证书
cat > ca-config.json <{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF

cat > ca-csr.json <{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "System"
}
]
}
EOF

cfssl gencert -initca ca-csr.json | cfssljson -bare ca -

#-----------------------

cat > server-csr.json <{
"CN": "kubernetes",
"hosts": [
"10.0.0.1",
"127.0.0.1",
"10.20.2.23",
"10.20.2.77",
"10.20.2.116",
"10.20.2.224",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server

#-----------------------

cat > admin-csr.json <{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
EOF

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin

#-----------------------

cat > kube-proxy-csr.json <{
"CN": "system:kube-proxy",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
完成之后拷贝到k8s的ssl目录
cp *.pem /opt/kubernetes/ssl/


生成token文件
chmod +x kubeconfig.sh

BOOTSTRAP_TOKEN=0fb61c46f8991b718eb38d27b605b008
cat > token.csv <

${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF
mv token.csv /opt/kubernetes/cfg/

在启动apiserver

也可以手动启动排查
source /opt/kubernetes/cfg/kube-apiserver
/opt/kubernetes/bin/kube-apiserver $KUBE_APISERVER_OPTS

启动另外2个节点
controller-manager

也可以修改存放目录
按照api-server修改就行然后重启服务即可
scheduler部署


也可以修改日志目录

查看集群状态
cp /root/soft/kubernetes/server/bin/kubectl /usr/bin/

查看资源的缩写
kubectl api-resources

上面属于master部署完成下面开始部署node节点

===============================================================================

开始部署node
先给之前token中的bulelet-bootstrap用户赋予组system:nodebootstrapper权限

kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap
删除执行:重点
kubectl delete clusterrolebinding kubelet-bootstrap


生成node的kubeconfig文件
作用存放api-service的认证信息

也就是上面的kubeconfig.sh内容
删掉上面的token配置就行
直接执行脚本
注意哈这里必须要有之前的token不然启动不了排查难


一定要有哈注意
kube-proxy.kubeconfig
bootstrap.kubeconfig
放到node节点上面

接下来正式开始部署node

没启动,创建一个日志目录方便排查
mkdir /opt/kubernetes/logs


在启动
发现日志目录没有东西看系统日志发现

没有文件
拷贝过来

在启动
查看
也可以手动排查
source /opt/kubernetes/cfg/kubelet
/opt/kubernetes/bin/kubelet $KUBELET_OPTS

或者去logs查看

已经去请求csr链接去master查看

加入
kubectl certificate approve node-csr-2om3CcYwTxM1RyruIaWYSRoUxbyCR9hm44TgkIN1Y2Q
停掉
kubectl certificate deny
删除
kubectl delete csr

查看node的ssl目录

这样子就成功了

接下来部署proxy
直接用脚本部署即可

启动一个容器验证一下



正在下载镜像

在创建一个svc
kubectl expose deployment nginx --port=8080 --target-port=80 --type=NodePort --dry-run -o yaml > svc.yaml


等待镜像下载完成访问一下
http://物理机ip+端口46661

接下来配置ui界面

wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

修改配置

完成之后启动

kubectl create -f kubernetes-dashboard.yaml

然后创建用户

创建service account并绑定默认cluster-admin管理员集群角色:
kubectl create serviceaccount dashboard-admin -n kube-system

绑定:
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

查看token

kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

复制token字符串然后到页面上面


后面可以在这里进行点击操作比如扩容pod副本数量

今天基本上吧搭建k8s流程介绍完成了,大家可以使用脚本进行部署,
需要注意,修改里面的ip地址哈