一 系统准备

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地址信息,可直接跳至主节点安装} vmmasterip
重 要 事 情 说 三 遍 : 我 这 里 用 的 是 v m 虚 拟 机 , 如 若 不 是 , 需 要 安 装 集 群 环 境 的 , 需 要 重 复 以 上 环 境 准 备 , 需 要 修 改 m a s t e r 主 机 名 加 i p 地 址 信 息 , 可 直 接 跳 至 主 节 点 安 装 \color{red}{重要事情说三遍:我这里用的是vm虚拟机,如若不是,需要安装集群环境的,需要重复以上环境准备,需要修改master主机名加ip地址信息,可直接跳至主节点安装} vmmasterip
重 要 事 情 说 三 遍 : 我 这 里 用 的 是 v m 虚 拟 机 , 如 若 不 是 , 需 要 安 装 集 群 环 境 的 , 需 要 重 复 以 上 环 境 准 备 , 需 要 修 改 m a s t e r 主 机 名 加 i p 地 址 信 息 , 可 直 接 跳 至 主 节 点 安 装 \color{red}{重要事情说三遍:我这里用的是vm虚拟机,如若不是,需要安装集群环境的,需要重复以上环境准备,需要修改master主机名加ip地址信息,可直接跳至主节点安装} vmmasterip
先关机

[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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐