K8s系列————Centos7.7或者Centos 8上部署kubernetes1.18集群环境
目录一 系统准备1、查看系统版本2、网络配置3、变更YUM源4、修改主机名5、关闭swap分区6、流量转发7、安装常用包二、Docker安装三、kubectl、kubelet、 kubeadm安装四、Kubernetes主节点安装五、安装从节点六、网络插件安装七、容器部署容器部署发布查看pods查看deployment查看已发布的服务查看服务详情验证服务服务删除八、集群入口内部访问ClusterI
目录
一 系统准备
1、查看系统版本
[root@localhost ~]# cat /etc/centos-release
显示如下信息
CentOS Linux release 7.7.1908 (Core)
2、网络配置
这里用静态ip,保持网络地址不会改变,根据自己情况而定,用的是vm虚拟机
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="275b2ce8-1e45-4c40-87cf-eaf112c46cc7"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.23.129"
PREFIX="24"
GATEWAY="192.168.23.2"
DNS1="192.168.23.2"
IPV6_PRIVACY="no"
3、变更YUM源
添加阿里源,因为是国外的镜像,删除原来yum
[root@localhost ~]# rm -rfv /etc/yum.repos.d/*
新增阿里源,这里是Centos 7系统
[root@localhost ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
新增阿里源,这里是Centos 8系统
[root@localhost ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
4、修改主机名
[root@localhost ~]# vi /etc/hosts
内容如下,在最后添加自己的ip地址及命名
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.23.129 master01.ajake.com master-01
重启机器
[root@localhost ~]# reboot -f
5、关闭swap分区
[root@master01 ~]# swapoff -a
注释分区
[root@master01 ~]# vi /etc/fstab
# /etc/fstab
# Created by anaconda on Mon Apr 6 19:43:17 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=fc379441-243a-46a5-ac34-e9c73d5067b4 /boot xfs defaults 0 0
# 注释swap相关信息
# /dev/mapper/centos-swap swap swap defaults 0 0
6、流量转发
[root@master01 ~] cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
粘贴如上信息回车即可
7、安装常用包
[root@master01 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
二、Docker安装
添加yum docker源信息
[root@master01 ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker-ce
[root@master01 ~]# yum -y install docker-ce
注意:如果是Centos 8 的话,缺失containerd.io-* 可能安装不上,需要以下步骤即可解决
获取containerd.io源信息
[root@master01 ~]# wget https://download.docker.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
安装containerd.io-1.2.6-3.3.el7.x86_64.rpm
[root@master01 ~]# yum install containerd.io-1.2.6-3.3.el7.x86_64.rpm
然后重新安装docker-ce即可
添加阿里云docker加速库
[root@master01 ~]# mkdir -p /etc/docker
登陆阿里云
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
获取如下信息
修改阿里镜像源
[root@master01 ~]# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["这里是阿里镜像加速地址"]
}
EOF
docker重启
[root@master01 ~]# systemctl daemon-reload
[root@master01 ~]# systemctl restart docker
三、kubectl、kubelet、 kubeadm安装
添加阿里kubernetes源信息
[root@master01 ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装
[root@master01 ~]# yum -y install kubectl kubelet kubeadm
安装成功
重
要
事
情
说
三
遍
:
我
这
里
用
的
是
v
m
虚
拟
机
,
如
若
不
是
,
需
要
安
装
集
群
环
境
的
,
需
要
重
复
以
上
环
境
准
备
,
需
要
修
改
m
a
s
t
e
r
主
机
名
加
i
p
地
址
信
息
,
可
直
接
跳
至
主
节
点
安
装
\color{red}{重要事情说三遍:我这里用的是vm虚拟机,如若不是,需要安装集群环境的,需要重复以上环境准备,需要修改master主机名加ip地址信息,可直接跳至主节点安装}
重要事情说三遍:我这里用的是vm虚拟机,如若不是,需要安装集群环境的,需要重复以上环境准备,需要修改master主机名加ip地址信息,可直接跳至主节点安装
重
要
事
情
说
三
遍
:
我
这
里
用
的
是
v
m
虚
拟
机
,
如
若
不
是
,
需
要
安
装
集
群
环
境
的
,
需
要
重
复
以
上
环
境
准
备
,
需
要
修
改
m
a
s
t
e
r
主
机
名
加
i
p
地
址
信
息
,
可
直
接
跳
至
主
节
点
安
装
\color{red}{重要事情说三遍:我这里用的是vm虚拟机,如若不是,需要安装集群环境的,需要重复以上环境准备,需要修改master主机名加ip地址信息,可直接跳至主节点安装}
重要事情说三遍:我这里用的是vm虚拟机,如若不是,需要安装集群环境的,需要重复以上环境准备,需要修改master主机名加ip地址信息,可直接跳至主节点安装
重
要
事
情
说
三
遍
:
我
这
里
用
的
是
v
m
虚
拟
机
,
如
若
不
是
,
需
要
安
装
集
群
环
境
的
,
需
要
重
复
以
上
环
境
准
备
,
需
要
修
改
m
a
s
t
e
r
主
机
名
加
i
p
地
址
信
息
,
可
直
接
跳
至
主
节
点
安
装
\color{red}{重要事情说三遍:我这里用的是vm虚拟机,如若不是,需要安装集群环境的,需要重复以上环境准备,需要修改master主机名加ip地址信息,可直接跳至主节点安装}
重要事情说三遍:我这里用的是vm虚拟机,如若不是,需要安装集群环境的,需要重复以上环境准备,需要修改master主机名加ip地址信息,可直接跳至主节点安装
先关机
[root@master01 ~]# shutdown now
把它作为基础,从节点只需要克隆该镜像即可使用
完成即可
四、Kubernetes主节点安装
获取安装文件yml
[root@master01 ~]# kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml
修改安装配置文件
[root@master01 ~]# vi kubeadm.yml
修改以下注释内容
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
# 修改主节点IP
advertiseAddress: 192.168.23.129
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: master01.ajake.com
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
# 国内不能访问 Google,修改为阿里云
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
networking:
dnsDomain: cluster.local
# 配置 POD 所在网段为我们虚拟机不重叠的网段
podSubnet: "10.244.0.0/16"
serviceSubnet: 10.96.0.0/12
scheduler: {}
如图所示
可以查看所需镜像
[root@master01 ~]# kubeadm config images list --config kubeadm.yml
输出以下信息
registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.0
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.18.0
registry.aliyuncs.com/google_containers/kube-scheduler:v1.18.0
registry.aliyuncs.com/google_containers/kube-proxy:v1.18.0
registry.aliyuncs.com/google_containers/pause:3.2
registry.aliyuncs.com/google_containers/etcd:3.4.3-0
registry.aliyuncs.com/google_containers/coredns:1.6.7
拉取镜像,静等10来分钟,具体快和慢和网络相关
[root@master01 ~]# kubeadm config images pull --config kubeadm.yml
安装主节点
[root@master01 ~]# kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log
说明 :
- init 命令是初始化
- - -upload-certs 参数可以在后续执行加入节点时自动分发证书文件
- tee kubeadm-init.log 用以输出日志
注意: 安装 kubernetes 版本和下载的镜像版本不统一则会出现
timed out waiting for the condition 错误。
想修改配置可以使用 kubeadm reset 命令重置配置,
重新初始化操作即可。
安装成功
配置 kubectl
[root@master01 ~]# mkdir -p $HOME/.kube
[root@master01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master01 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
验证是否成功
[root@master01 ~]# kubectl get node
显示如下信息
NAME STATUS ROLES AGE VERSION
master01.ajake.com NotReady master 11m v1.18.3
需要关闭防火墙使得从节点可加入,也可以开放相关的端口6443
[root@master01 ~]# systemctl stop firewalld
五、安装从节点
克隆一个刚才安装好的虚拟机,不能克隆已安装好的主节点
修改hostName
[root@master01 ~]# vi /etc/hosts
新增如下信息
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.23.129 master01.ajake.com master-01
192.168.23.130 node01.ajake.com node-01
修改网卡静态ip
[root@master01 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
重启机器
[root@master01 ~]# reboot -f
加入刚才的集群环境
主节点日志有怎么添加至集群环境
同时也需要开放相关端口号6443,我这里直接关闭防火墙
[root@master01 ~]# systemctl stop firewalld
我这里是这样,直接在node-01节点上执行即可
[root@node01 ~]# kubeadm join 192.168.23.129:6443 --token abcdef.0123456789abcdef
--discovery-token-ca-cert-hash sha256:6dad4602dd288cbfbc952e3a9db40ee192ae8c4229479d60b330c95940131c06
节点验证
返回主节点查看
[root@master01 ~]# kubectl get nodes
显示如下信息
NAME STATUS ROLES AGE VERSION
master01.ajake.com NotReady master 40m v1.18.3
node01.ajake.com NotReady <none> 5m15s v1.18.3
这里的STATUS是NotReady因为coredns,需要安装网络插件
在master节点上查看 Pods 状态
[root@master01 ~]# watch kubectl get pods -n kube-system -o wide
显示如下信息
Every 2.0s: kubectl get pods -n kube-system -o wide Sun May 24 17:15:07 2020
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-7ff77c879f-4cpft 0/1 Pending 0 44m <none> <none> <none> <none>
coredns-7ff77c879f-7fp9j 0/1 Pending 0 44m <none> <none> <none> <none>
etcd-master01.ajake.com 1/1 Running 1 44m 192.168.23.129 master01.ajake.com <none> <none>
kube-apiserver-master01.ajake.com 1/1 Running 1 44m 192.168.23.129 master01.ajake.com <none> <none>
kube-controller-manager-master01.ajake.com 1/1 Running 1 44m 192.168.23.129 master01.ajake.com <none> <none>
kube-proxy-4tb2d 1/1 Running 1 44m 192.168.23.129 master01.ajake.com <none> <none>
kube-proxy-hg2mw 1/1 Running 0 9m14s 192.168.23.130 node01.ajake.com <none> <none>
kube-scheduler-master01.ajake.com 1/1 Running 1 44m 192.168.23.129 master01.ajake.com <none> <none>
六、网络插件安装
在使用使用容器的时候,只是提供一个CNI(Container Network Interface) 标准的通用的接口,容器网络解决方案 flannel,calico,Canal,weave,使用这些解决方案可以满足该协议的所有容器平台提供网络功能。
Calico链接 https://docs.projectcalico.org/introduction/
Flannel链接 https://github.com/coreos/flannel/
Weave链接 https://www.weave.works/oss/net/
Canal 链接 https://github.com/projectcalico/canal
我这里使用的是calico,因为支持网络策略、支持服务网格Istio集成
官方的安装文档:https://docs.projectcalico.org/getting-started/kubernetes/quickstart
获取yml文档
[root@master01 ~]# wget https://docs.projectcalico.org/manifests/calico.yaml
修改文档
[root@master01 ~]# vim calico.yaml
使用vim 命令模式 输入:set number ,然后查询命令?CALICO_IPV4POOL_CIDR ,修改之前定义的网络端口号
安装calico.yml
[root@master01 ~]# kubectl apply -f calico.yaml
验证安装是否成功
[root@master01 ~]# watch kubectl get pods --all-namespaces
显示如下:
Every 2.0s: kubectl get pods --all-namespaces Sun May 24 19:10:03 2020
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-789f6df884-bv66x 1/1 Running 0 35m
kube-system calico-node-5xs5t 1/1 Running 0 35m
kube-system calico-node-stvmk 1/1 Running 0 35m
kube-system coredns-7ff77c879f-4cpft 1/1 Running 0 159m
kube-system coredns-7ff77c879f-7fp9j 1/1 Running 0 159m
kube-system etcd-master01.ajake.com 1/1 Running 1 159m
kube-system kube-apiserver-master01.ajake.com 1/1 Running 1 159m
kube-system kube-controller-manager-master01.ajake.com 1/1 Running 1 159m
kube-system kube-proxy-4tb2d 1/1 Running 1 159m
kube-system kube-proxy-hg2mw 1/1 Running 0 124m
kube-system kube-scheduler-master01.ajake.com 1/1 Running 1 159m
查看 nodes状态
[root@master01 ~]# kubectl get nodes
显示STATUS -Ready代表网络已经组成
NAME STATUS ROLES AGE VERSION
master01.ajake.com Ready master 127m v1.18.3
node01.ajake.com Ready <none> 91m v1.18.3
七、容器部署
这里需要注意的是,之前使用 --replicas方式已经不推荐使用了
Flag --replicas has been deprecated, has no effect and will be removed in the future.
在K8S v1.18.0以后,–replicas已弃用 ,推荐用 deployment 创建 pods。
我这里使用nginx-1.18.0容器,作为示例
[root@master01 ~]# vi nginx-deployment.yaml
内容如下:
apiVersion: apps/v1 #指定api版本,此值必须在kubectl apiversion中
kind: Deployment # 指定创建资源的角色/类型
metadata: #资源的元数据/属性
name: nginx-deployment #资源的名字,在同一个namespace中必须唯一
labels: #设定资源的标签
app: nginx
spec: #指定该资源的内容
replicas: 2 #创建2个nginx容器
selector: #节点选择
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx #设定资源的标签
spec:
containers:
- name: nginx #容器的名字
image: nginx:1.18.0 #容器使用的镜像地址
ports:
- containerPort: 80 #容器开发对外的端口
---
apiVersion: v1 # API 版本号
kind: Service # 类型,如:Pod/ReplicationController/Deployment/Service/Ingress
metadata: # 元数据
name: nginx-deployment # Kind 的名称
spec:
ports:
- port: 80 # Service 暴露的端口
targetPort: 80 # Pod 上的端口,这里是将 Service 暴露的端口转发到 Pod 端口上
type: LoadBalancer # 类型
selector: # 标签选择器
app: nginx # 需要和上面部署的 Deployment 标签名对应
1、容器部署发布
[root@master01 ~]# kubectl apply -f nginx-deployment.yaml
2、查看pods
[root@master01 ~]# kubectl get pods
显示如下
NAME READY STATUS RESTARTS AGE
nginx-deployment-6b474476c4-6q6zf 1/1 Running 0 51s
nginx-deployment-6b474476c4-l24cc 1/1 Running 0 51s
3、查看deployment
[root@master01 ~]# kubectl get deployment
显示如下
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 74s
4、查看已发布的服务
[root@master01 ~]# kubectl get services
显示如下
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h7m
nginx-deployment LoadBalancer 10.100.43.48 <pending> 80:32345/TCP 12s
5、查看服务详情
[root@master01 ~]# kubectl describe service nginx-deployment
显示如下:
Name: nginx-deployment
Namespace: default
Labels: app=nginx
Annotations: <none>
Selector: app=nginx
Type: LoadBalancer
IP: 10.100.43.48
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32345/TCP
Endpoints: 10.244.119.69:80,10.244.119.70:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
这里NodePort暴露了32345这个端口号,可以看到已经运行了两个nginx 虚拟机如若打开防火墙,需要开启32345端口
验证服务
外面直接访问ip地址加端口号,类似如下
http://192.168.23.129:32345/
http://192.168.23.130:32345/
6、服务删除
[root@master01 ~]# kubectl delete -f nginx-deployment.yaml
八、集群入口
1、内部访问ClusterIP
2、三种方式外部访问
- NodePort : 服务的最原始方式 (生产不推荐使用)
- LoadBalancer:指定的端口的流量都会被转发到对应的服务,没有过滤条件,没有路由等,可以任意协议
- Ingress: 智能路由
NodePort 网络访问方式
LoadBalancer 网络访问方式
Ingress网络访问方式
4、ingress-nginx 安装方法
国内用raw.githubusercontent.com会出现连接超时
手动复制
https://github.com/kubernetes/ingress-nginx/blob/master/deploy/static/provider/cloud/deploy.yaml
[root@master01 ~]# vi ingress-nginx.yaml
大概这个位置参数:hostNetWork: true
镜像地址需要更换为:quay-mirror.qiniu.com/kubernetes-ingress-controller/nginx-ingress-controller:0.32.0
5、部署
[root@master01 ~]# kubectl apply -f ingress-nginx.yaml
查看pods状态
[root@master01 ~]# watch kubectl get pods -n ingress-nginx -o wide
显示如下
Every 2.0s: kubectl get pods -n ingress-nginx -o wide Mon May 25 21:54:46 2020
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-nginx-admission-create-fhbz8 0/1 Completed 0 6m26s 10.244.119.80 node01.ajake.com <none> <none>
ingress-nginx-admission-patch-n49r4 0/1 Completed 0 6m26s 10.244.119.81 node01.ajake.com <none> <none>
ingress-nginx-controller-94495bd88-2wnbh 1/1 Running 0 6m36s 192.168.180.145 node01.ajake.com <none> <none>
6、Tomcat 9.0服务器部署
编写
[root@master01 ~]#vi tomcat-9.0.35.yaml
内容如下
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-app
spec:
selector:
matchLabels:
# 容器标签的名字,发布 Service 时,selector 需要和这里对应
app: tomcat
replicas: 2
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:9.0.35
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-http
spec:
ports:
- port: 8080
targetPort: 8080
# ClusterIP, NodePort, LoadBalancer
type: ClusterIP
selector:
app: tomcat
部署
[root@master01 ~]# kubectl apply -f tomcat-9.0.35.yaml
7、Ingress 反向代理 Tomcat
编写
[root@master01 ~]# vi ingress-to-tomcat.yaml
内容如下
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx-web
annotations:
# 指定 Ingress Controller 的类型
kubernetes.io/ingress.class: "nginx"
# 指定我们的 rules 的 path 可以使用正则表达式
nginx.ingress.kubernetes.io/use-regex: "true"
# 连接超时时间
nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
# 后端服务器回转数据超时时间
nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
# 后端服务器响应超时时间
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
# 客户端上传文件,最大大小
nginx.ingress.kubernetes.io/proxy-body-size: "10m"
# URL 重写
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
# 路由规则
rules:
# 主机名,只能是域名,修改为你自己的
- host: node01.ajake.com
http:
paths:
- path:
backend:
# 后台部署的 Service Name
serviceName: tomcat-http
# 后台部署的 Service Port
servicePort: 8080
部署
[root@master01 ~]# kubectl apply -f ingress-to-tomcat.yaml
获取ingress状态
[root@master01 ~]# kubectl get ingress
显示如下
NAME CLASS HOSTS ADDRESS PORTS AGE
nginx-web <none> node01.ajake.com 80 50s
8、验证
在windows机器上修改C:\Windows\System32\drivers\etc\hosts文件
添加node的ip至node01.ajake.com
其他事项说明
问题一:重启之后出现以下问题是因为没有加开机自启动服务
[root@master01 ~]# kubectl get node
The connection to the server 192.168.23.129:6443 was refused - did you specify the right h ost or port?
解决办法,从节点也需要这样操作,重启之后自动加入主节点
[root@master01 ~]# systemctl start kubelet
## 添加开机启动
[root@master01 ~]# systemctl enable kubelet
[root@master01 ~]# systemctl enable docker
问题二:主节点如何删除从节点
[root@master01 ~]# kubeadm delete nodes <NAME>
问题三:Node节点加入Master配置有问题
解决办法:在 Node 节点上使用 kubeadm reset 重置配置再使用 kubeadm join
更多推荐
所有评论(0)