文章目录
一. 区分两种—安装方式
部署工具:
使用批量部署工具如(ansible/ saltstack)、手动二进制
、apt-get/yum 等方式安装,以守护进程的方式启动在宿主机上
,类似于是 Nginx 一样使用 service 脚本启动。
-
kubeadm方式 安装:
kubeadm是k8s部署工具,提供kubeadm init 和kubeadm join用于 快速部署k8s集群
使用 k8s 官方提供的部署工具 kubeadm自动安装
,需要在 master 和 node 节点上安装 docker 等组件,然后初始化,把管理端的控制服务和 node 上的服务都以pod 的方式运行。
kubeadm介绍 -
ansible方式 安装:
二. kubeadm方式安装步骤
具体步骤:
1 . 基础环境准备
2、 部署 harbor 及 haproxy 高可用反向代理
3、在所有 master 安装指定版本的 kubeadm 、kubelet、kubectl、docker
4、在所有 node 节点安装指定版本的 kubeadm 、kubelet、docker,在 node 节点 kubectl 为
可选安装
,看是否需要在 node 执行 kubectl 命令进行集群管理及 pod 管理等操作。
5、master 节点运行 kubeadm init 初始化命令
6、验证 master 节点状态
7、在 node 节点使用 kubeadm 命令将自己加入 k8s master(需要使用 master 生成 token 认 证)
8、验证 node 节点状态
9、创建 pod 并测试网络通信
10、部署 web 服务 Dashboard
11、k8s 集群升级
1. 基础环境
192.168.66.111 k8s-master1.com
192.168.66.112 k8s-master2.com
192.168.66.113 k8s-haproxy1.com
192.168.66.114 k8s-haproxy2.com
192.168.66.115 k8s-harbor.com
192.168.66.116 k8s-node1.com
192.168.66.117 k8s-node2.com
安装注意事项:
注意:禁用 swap,selinux,iptables
systemctl disable iptables firewalld
systemctl stop iptables firewalld
swapoff -a 临时关闭
vim /etc/fstab 永久关闭
修改主机名 ,并在每个主机中添加hosts解析
环境规划
要求cpu=2+
内存>
2G
master—200
node1—201
node2—202
设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
# 应用 sysctl 参数而无需重新启动
sudo sysctl --system
2.harbor及keepalived+haproxy
keepalived实现VIP浮动
apt install keepalived
cat /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface eth0
garp_master_delay 10
smtp_alert
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.31.7.248 dev eth0 label eth0:1
} }
haproxy实现反向代理
listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth haadmin:q1w2e3r4ys
listen k8s-6443
bind 172.31.7.248:6443
mode tcp
balance roundrobin
server 172.31.3.101 172.31.3.101:6443 check inter 2s fall 3 rise 5
harbor仓库参考
3. master和node安装docker
- 安装 docker:
安装必要的一些系统工具
注意与Docker版本要求
以及操作系统版本
apt-get update && apt-get -y install apt-transport-https ca-certificates curl software-properties-common
安装 GPG 证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
更新并安装 Docker-CE
apt-get -y update && apt-get -y install docker-ce
启动
systemctl start docker && systemctl enable docker
docker version
- 配置 docker 加速器:在阿里云中
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://*****.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker info 验证镜像加速器
4.所有节点安装 kubelet,kubeadm,kubectl
- 配置阿里云仓库地址:
配置阿里云镜像的kubernetes 源
(用于安装 kubelet kubeadm kubectl 命令)
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
#手动输入 EOF 用于结束
- 安装 kubelet kubeadm kubectl:
apt-get update
#安装指定版本 kubeadm
apt-cache madison kubeadm #查看版本信息
安装1.20.2-00版本
apt-get install kubeadm=1.20.2-00 kubelet=1.20.2-00 kubectl=1.20.2-00 -y
#这样会直接安装为最新版本
# apt-get install -y kubelet kubeadm kubectl
kubeadm --help 验证一下
systemctl start kubelet && systemctl enable kubelet && systemctl status kubelet
验证master节点 kubelet 开机自启动:
vim /var/log/syslog
5. master 节点运行 kubeadm init 初始化命令
多台 master 中任意一台 master 进行集群初始化
,而且集群初始化只需要初始化一次
验证版本:
kubeadm version
#查看当前 kubeadm 版本
准备–生成镜像
kubeadm config images list --kubernetes-version v1.20.2
#查看安装指定版本 k8s(国外的)
# kubeadm config images list --kubernetes-version v1.17.3
k8s.gcr.io/kube-apiserver:v1.17.3
k8s.gcr.io/kube-controller-manager:v1.17.3
k8s.gcr.io/kube-scheduler:v1.17.3
k8s.gcr.io/kube-proxy:v1.17.3
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
master 节点镜像下载:
推荐提前在 master 节点下载镜像以减少安装等待时间,但是镜像默认使用 Google 的镜像仓库,所以国内无法直接下载,但是可以通过阿里云的镜像仓库把镜像先提前下载下来
,可以避免后期因镜像下载异常而导致 k8s 部署异常
# cat images-download.sh
#!/bin/bash
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.3
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.17.3
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.3
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.3
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.5
# bash images-download.sh
单节点master初始化
kubeadm init --apiserver-advertise-address=本机ip \
--apiserver-bind-port=6443 \
--kubernetes-version=v1.20.2 \
--pod-network-cidr=10.10.0.0/16 \
--service-cidr=10.20.0.0/16 \
--service-dns-domain=qcq.com \
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
--ignore-preflight-errors=swap #忽略swap错误
--pod-network-cidr #设置 pod ip 地址范围
--service-cidr #设置 service 网络地址范围
--image-repository 从aliyun下载 ,默认是k8s.gcr.io在国外,难以拉取
如果出现
加CPU ,加内存
最终结果
在本机用docker images
查看是否有正在镜像
会生成一下镜像
----7个
高可用 master 初始化
首先基于 keepalived 实现高可用 VIP
,然后实现多台 k8s master 基于 VIP 实现高可用。
基于命令初始化高可用 master 方式
:
kubeadm init --apiserver-advertise-address=本机ip \
--control-plane-endpoint=Keepalived的VIP \
--apiserver-bind-port=6443 \
--kubernetes-version=v1.17.3 \
--podnetwork-cidr=10.10.0.0/16 \
--service-cidr=172.26.0.0/16 \
--service-dns-domain=magedu.local \
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
--ignore-preflight-errors=swap
基于文件初始化高可用 master 方式
# kubeadm config print init-defaults #输出默认初始化配置
#将默认配置输出至文件
kubeadm config print init-defaults > kubeadm-init.yaml
cat kubeadm-init.yaml #修改后的初始化文件内容
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 172.31.3.101
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8s-master1.magedu.net
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 172.31.7.248:6443 #添加基于 VIP 的 Endpoint
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.17.3
networking:
dnsDomain: magedu.local
podSubnet: 10.10.0.0/16
serviceSubnet: 172.26.0.0/16
scheduler: {}
基于文件
执行 k8s master 初始化
kubeadm init --config kubeadm-init.yaml
4. master 配置 kube 证书
证书中包 kube-apiserver 地址
及相关认证信息
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
授权
sudo chown $(id -u):$(id -g) $HOME/.kube/config
cat /root/.kube/config
验证 k8s 状态:
kubectl get cs
nodes
添加node节点:在node节点中执行
kubectl get nodes
5. 部署 flannel----在master
https://github.com/coreos/flannel/
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
或者
kubectl apply -f kube-flannel.yml
需要 确保能够访问quay.io的registery
,如果镜像下载失败—更改镜像地址
会下载一个flannel的镜像
kubectl get pods -n kube-system
kubectl get pods --all-namespaces
master 证书用于添加新控制节点
kubeadm init phase upload-certs --upload-certs
W0322 11:38:39.512764 18966 validation.go:28] Cannot validate kube-proxy config - no
validator is available
W0322 11:38:39.512817 18966 validation.go:28] Cannot validate kubelet config - no validator
is available
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system"
Namespace
[upload-certs] Using certificate key:
#会用到这个
b66cd885cbd3b94cace2ddfad3037935ba3dabc63bf2aee0c28878b6857ac53b
+++获取登录 token
# kubectl get secret -A | grep admin-user
# kubectl describe secret admin-user-token-lkwbr -n kubernetes-dashboard
7.添加 master 节点:
在另外一台已经安装了 docker、kubeadm 和 kubelet 的 master 节点上执行以下操作
# kubeadm join 172.31.7.248:6443 \
--token 0fpghu.wt0t8adybh86jzvk \
--discovery-token-ca-cert-hash
sha256:aae2c43db9929b06c094e65a4614112676f8cafb80809c8071f2ee141edfc787 \
--control-plane \
--certificate-key b66cd885cbd3b94cace2ddfad3037935ba3dabc63bf2aee0c28878b6857ac53b
8. 添加node 节点
在node节点中执行
各 node 节点都要安装 docker kubeadm kubelet
,配置 apt 仓库、配置 docker 加速器、安装命令、启动 kubelet 服务。
root@docker-node2:~# systemctl start docker kubelet
root@docker-node2:~# systemctl enable docker kubelet
这个命令来源于初始化master端kubeadm init生成的
kubeadm join 192.168.1.200:6443 --token klom40.qsjenuw04czukdxz \
--discovery-token-ca-cert-hash sha256:ad11ca7bf6e6e2260b3d8a5b2e52f8d8280e59c2d647d58b7b41580f2655f893
Node 节点会自动加入到 master 节点,下载镜像并启动 flannel,直到最终在 master 看 到 node 处于 Ready 状态
注:Node 节点会自动加入到 master 节点
,下载镜像并启动 flannel,直到在 master看到 node 处于 Ready
状态
9. k8s 创建容器并测试
创建测试容器,测试网络连接:
docker pull alpine
--reolicas创建几个pods
kubectl run net-test1 --image=alpine --replicas=2 sleep 360000
kubectl get pod,svc
验证 各个节点状态
验证 master 状态:
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kubeadm-master1.magedu.net Ready master 12m v1.17.3
kubeadm-master2.magedu.net Ready master 6m30s v1.17.3
kubeadm-master3.magedu.net Ready master 5m39s v1.17.3
验证 k8s 集群状态:
# kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
当前 csr 证书状态:
# kubectl get csr
NAME AGE REQUESTOR CONDITION
csr-7bzrk 14m system:bootstrap:0fpghu Approved,Issued
csr-jns87 20m system:node:kubeadm-master1.magedu.net Approved,Issued
csr-vcjdl 14m system:bootstrap:0fpghu Approved,Issued
验证 node 节点状态
kubectl get node
部署 web 服务 dashboard:
https://github.com/kubernetes/dashboard
部署 dashboard
kubectl apply -f dashboard-2.0.0-rc6.yml -f admin-user.yml
获取登录 token:
# kubectl get secret -A | grep admin-user
# kubectl describe secret admin-user-token-lkwbr -n kubernetes-dashboard
验证 NodePort
登录 dashboard:
https://172.31.3.107:30002/#/login
三. kubeadm init 流程
https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/
四. kubeadm 升级 k8s 集群
升级 k8s 集群必须 先升级 kubeadm 版本到目的 k8s 版本
1.升级master
验证当 k8s 前版本
kubeadm version
安装指定版本 kubeadm:
#查看具体版本
root@docker-node1:~# apt-cache madison kubeadm
#安装指定 新版本版本
root@docker-node1:~# apt-get install kubeadm=1.20.6-00 kubeadm=1.20.6-00 kubectl=1.20.6-00
#验证版本
root@docker-node1:~# kubeadm version
kubeadm 升级命令使用帮助:
root@docker-node1:~# kubeadm upgrade --help
升级计划:
kubeadm upgrade plan
#查看升级计划
开始升级:
kubeadm upgrade apply v1.20.6
最后验证镜像是否升级成功
docker images
2. 升级 kubelet的 node节点
否则 node 节点还是 1.13.5 的旧版本,但是 server 已经是 1.13.6
root@docker-master:~# kubeadm upgrade node config --kubelet-version 1.20.6
root@docker-master:~# kubectl get nodes
升级 node 节点配置文件:
root@docker-master:~# kubeadm upgrade node config --kubelet-version 1.20.6
各 Node 节点升级 kubelet 二进制包:
root@docker-node1:~# apt-get install kubelet=1.20.6-00 kubeadm=1.20.6-00 kubectl=1.20.6-00
root@docker-node2:~# apt-get install kubelet=1.20.6-00 kubeadm=1.20.6-00 kubectl=1.20.6-00
最终版本
测试运行 Nginx+Tomcat
https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/
运行 Nginx:
cd /opt/kubdadm-yaml
cat nginx/nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: default
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.4 或者是harbor中的镜像
ports:
- containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
labels:
app: magedu-nginx-service-label
name: magedu-nginx-service
namespace: default
spec:
type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
nodePort: 30004
selector:
app: nginx
kubectl apply -f nginx/nginx.yml
运行 tomcat:
docker pull tomcat
mkdir /usrlocal/src/kubdam-qcq/tomcat-dockerfile
vim Dockerfile
FROM tomcat
ADD ./app /usr/local/tomcat/webapps/app/
vim app
tomcat image page
打镜像 可以直接达到harbor中---harbor地址要正确
docker build -t harbor.qcq.com/linux/tomcat:app .
也可以打到本地
docker build -t tomcat:v1 .
测试
docker run -it --rm -p 8080:8080 tomcat:v1
然后访问ip:8080/app/
然后
docker tag
docker push 到harbor
cd /opt/kubdadm-yaml
cat tomcat/tomcat.yml
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: default
name: tomcat-deployment
labels:
app: tomcat
spec:
replicas: 1
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: harbor地址中的tomcat
ports:
- containerPort: 8080
---
kind: Service
apiVersion: v1
metadata:
labels:
app: magedu-tomcat-service-label
name: magedu-tomcat-service
namespace: default
spec:
type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
#nodePort: 30005
selector:
app: tomcat
创建Nginx pod
kubectl apply -f nginx/tomcat.yml
查看一下是否起来
kubectl get pod
从 dashboard 进入容器
测试访问 Nginx
访问 tomcat:
进入 tomcatpod 生成 app
:
# kubectl get pod
# kubectl exec -it tomcat-deployment-78c89857d6-p5tv7 bash
# cd webapps
# mkdir tomcat
# echo "Tomcat test page for Pod" > tomcat/index.html
Nginx 实现动静分离
Nginx 配置:
进入到 nginx Pod
kubectl exec -it nginx-deployment-67656986d9-f74lb bash
cat /etc/issue
Debian GNU/Linux 9 \n \l
更新软件源并安装基础命令
apt update
apt install procps vim iputils-ping net-tools curl
测试 service 解析
/# ping magedu-tomcat-service
测试在 nginx Pod 通过 tomcat Pod 的 service 域名访问:
/# curl magedu-tomcat-service.default.svc.magedu.local/tomcat/index.html
Tomcat test page for Pod
修改 Nginx 配置文件实现动静分离,Nginx 一旦接受到有/tomcat 的 uri 就转发给 tomcat
/# vim /etc/nginx/conf.d/default.conf
location /tomcat {
proxy_pass http://magedu-tomcat-service.default.svc.magedu.local;
}
测试配置文件
/# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新加载配置文件
/# nginx -s reload
2020/03/22 09:10:49 [notice] 4057#4057: signal process started
通过 HAProxy 实现高可用反向代理
基于 haproxy 和 keepalived 实现高可用的反向代理,并访问到运行在 kubernetes集群中业务 Pod
。
keepalived VIP 配置:
vrrp_instance VI_1 {
state MASTER
interface eth0
garp_master_delay 10
smtp_alert
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.31.7.248 dev eth0 label eth0:1
#这个VIP
172.31.7.249 dev eth0 label eth0:2
}
# systemctl restart keepalived
HAProxy 反向代理配置:
listen k8s-6443
bind 172.31.7.248:6443
mode tcp
balance roundrobin
server 172.31.3.101 172.31.3.101:6443 check inter 2s fall 3 rise 5
# node节点,直接监听为80端口
listen k8s-magedu-80
bind 172.31.7.249:80
mode tcp
balance roundrobin
server 172.31.3.107 172.31.3.107:30004 check inter 2s fall 3 rise 5
server 172.31.3.108 172.31.3.108:30004 check inter 2s fall 3 rise 5
server 172.31.3.109 172.31.3.109:30004 check inter 2s fall 3 rise 5
测试通过 VIP 访问
token管理
1.令牌登登陆
# kubeadm token --help
create #创建 token,默认有效期 24 小时
delete #删除 token
generate #生成并打印 token,但不在服务器上创建,即将 token 用于其他操作
list #列出服务器所有的 token
设置token登录会话保持时间
vim dashboard/kubernetes-dashboard.yaml
image: 192.168.200.110/baseimages/kubernetes-dashboard-amd64:v1.10.1
ports:
- containerPort: 8443 4
protocol: TCP
args:
- --auto-generate-certificates
- --token-ttl=43200
session保持
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800
2. Kubeconfig登录
制作Kubeconfig文件
dashboard下面有一个
vim /root/.kube/config
加入一行
注意严格的缩进,前四,后一 空格
token: 令牌
token内容
然后将这个文件下载到桌面
登陆时用kubeconfig登陆,选择config文件
reset 命令:
kubeadm reset
#还原 kubeadm 操作
kubeadm 命令
命令使用:
https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm/
集群初始化名:
https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/
--apiserver-advertise-address string #API Server 将要监听的监听地址
--apiserver-bind-port int32 #API Server 绑定的端口,默认为 6443,
--apiserver-cert-extra-sans stringSlice #可选的证书额外信息,用于指定 API Server
的服务器证书。可以是 IP 地址也可以是 DNS 名称。
--cert-dir string #证书的存储路径,缺省路径为 /etc/kubernetes/pki
--config string #kubeadm 配置文件的路径
--ignore-preflight-errors strings #可以忽略检查过程 中出现的错误信息,比如忽略
swap,如果为 all 就忽略所有
--image-repository string #设置一个镜像仓库,默认为 k8s.gcr.io
--kubernetes-version string #选择 k8s 版本,默认为 stable-1
--node-name string #指定 node 名称
--pod-network-cidr #设置 pod ip 地址范围
--service-cidr #设置 service 网络地址范围
--service-dns-domain string #设置域名,默认为 cluster.local
--skip-certificate-key-print #不打印用于加密的 key 信息
--skip-phases strings #要跳过哪些阶段
--skip-token-print #跳过打印 token 信息
--token #指定 token
--token-ttl #指定 token 过期时间,默认为 24 小时,0 为永不过期
--upload-certs #更新证书
#全局选项
--log-file string #日志路径
--log-file-max-size uint #设置日志文件的最大大小,单位为兆,默认为 1800,0 为
没有限制 --rootfs #宿主机的根路径,也就是使用绝对路径
--skip-headers #为 true,在 log 日志里面不显示消息的头部信息
--skip-log-headers #为 true 在日志文件里面不记录头部信息