分类 Paas 下的文章

本文是关于 k8s 离线安装部署的教程,包括设置 ipvs 模式以提升性能,安装 kuboard、metrics-server、ingress-nginx 等组件,涉及端口范围修改、去除污点、解决不可访问和组件不健康问题,还介绍了相关组件的安装步骤、配置和测试方法。

关联问题:如何修改端口范围怎样清除iptables规则Ingress安装注意事项

k8s离线安装部署教程

文件名称版本号linux核心
docker版本20.10.9x86
k8s版本v1.22.4x86
kuboardv3x86

6.设置ipvs模式

k8s整个集群为了访问通;默认是用iptables,性能下降(kube-proxy在集群之间同步iptables的内容)

每个pod,都需要分配一个ip,每个节点,kube-proxy,会同步其他节点的pod的ip,以保证iptables一致,才能让各节点访问得通,则会不断得同步iptables,这样十分影响性能。

sh代码解读复制代码#1、查看默认kube-proxy 使用的模式 kubectl get pod -A|grep kube-proxy kubectl logs -n kube-system kube-proxy-xxxx  #2、需要修改 kube-proxy 的配置文件,修改mode 为ipvs。默认iptables,但是集群大了以后就很慢 kubectl edit cm kube-proxy -n kube-system 修改如下    ipvs:       excludeCIDRs: null       minSyncPeriod: 0s       scheduler: ""       strictARP: false       syncPeriod: 30s     kind: KubeProxyConfiguration     metricsBindAddress: 127.0.0.1:10249     mode: "ipvs"   ###修改了kube-proxy的配置,为了让重新生效,需要杀掉以前的Kube-proxy kubectl get pod -A|grep kube-proxy kubectl delete pod kube-proxy-xxxx -n kube-system ### 修改完成后可以重启kube-proxy以生效

7.安装kuboard

kuboard安装:版本:v3

在线安装:

sh代码解读复制代码kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml

离线安装:

先下载kuboard-v3.yaml文件

由于执行kuboard-v3.yaml,需要用到镜像,无法上网的,可以在有网的服务器先下载对应的镜像。

sh代码解读复制代码cat kuboard-v3.yaml | grep image: | awk '{print $2}'

eipwork/etcd-host:3.4.16-1 eipwork/kuboard:v3

下面这两个镜像,通过这行命令,无法获取到,是官网文档说明,需要pull

eipwork/kuboard-agent:v3 questdb/questdb:6.0.4

bash代码解读复制代码# 拉取全部镜像 cat kuboard-v3.yaml \     | grep image: \     | awk '{print "docker pull " $2}' \     | sh  # pull另外两个镜像  docker pull eipwork/kuboard-agent:v3 docker pull questdb/questdb:6.0.4  # 在当前目录导出镜像为压缩包 docker save -o kuboard-v3.tar eipwork/kuboard:v3 docker save -o etcd-host-3.4.16-1.tar eipwork/etcd-host:3.4.16-1 docker save -o kuboard-agent-v3.tar eipwork/kuboard-agent:v3 docker save -o questdb-6.0.4.tar questdb/questdb:6.0.4  # 加载到docker环境 docker load -i kuboard-v3.tar docker load -i etcd-host-3.4.16-1.tar docker load -i kuboard-agent-v3.tar docker load -i questdb-6.0.4.tar  # 安装kuboard kubectl apply -f kuboard-v3.yaml  # 删除kuboard kubectl delete -f kuboard-v3.yaml

注意,这里,kuboard-v3.yaml,imagePullPolicy:需要将Always,改为IfNotPresent

yaml代码解读复制代码            image: 'eipwork/etcd-host:3.4.16-1'           # 这里需要将Always,改为IfNotPresent(表示本地有镜像时,不从仓库下)           imagePullPolicy: IfNotPresent     --- apiVersion: apps/v1 kind: Deployment metadata:   annotations: {}   labels:     k8s.kuboard.cn/name: kuboard-v3   name: kuboard-v3   namespace: kuboard             image: 'eipwork/kuboard:v3'           # 这里需要将Always,改为IfNotPresent(表示本地有镜像时,不从仓库下)           imagePullPolicy: IfNotPresent

启动效果如下:

# 启动kuboard-v3

kubectl apply -f kuboard-v3.yaml

# 查看kuborad是否启动成功:

kubectl get pods -n kuboard

在这里插入图片描述

如果只有三个,没有启动kuboard-agent-xxx容器。请继续行往下操作:

8.访问Kuboard

  • 在浏览器中打开链接 http://your-node-ip-address:30080

  • 输入初始用户名和密码,并登录

    • 用户名: admin

    • 密码: Kuboard123

image.png

首页,默认情况下,这里会显示导入中(agent没有启动情况下),点击进入到default中 image.png

导出:kuboard-agent.yaml文件

image.png

注意:这个kuboard-agent.yaml文件,镜像拉取方式,需要修改imagePullPolicy:需要将Always,改为IfNotPresent

bash代码解读复制代码kubectl apply -f ./kuboard-agent.yaml

最终效果:

image.png

image.png

image.png

9.安装metrics-server

为了可以在kuboard中,能看到服务器的资源,可以监控

metrics-server.yaml,版本0.5.0

image.png

在这里选择安装metrics-server,一步一步,操作下去,最后预览生成的yaml文件,保存为metrics-server.yaml文件

离线安装:

metrics-server.yaml文件

由于执行metrics-server.yaml,需要用到镜像,无法上网的,可以在有网的服务器先下载对应的镜像。

swr.cn-east-2.myhuaweicloud.com/kuboard-dependency/metrics-server:v0.5.0

bash代码解读复制代码# 拉取全部镜像 docker pull swr.cn-east-2.myhuaweicloud.com/kuboard-dependency/metrics-server:v0.5.0  # 在当前目录导出镜像为压缩包 docker save -o metrics-server-v0.5.0.tar swr.cn-east-2.myhuaweicloud.com/kuboard-dependency/metrics-server:v0.5.0  # 加载到docker环境 docker load -i metrics-server-v0.5.0.tar  # 安装kuboard kubectl apply -f metrics-server.yaml  # 删除kuboard kubectl delete -f metrics-server.yaml

metrics-server.yaml文件如下:

yaml代码解读复制代码 --- apiVersion: v1 kind: Service metadata:   labels:     k8s-app: metrics-server   name: metrics-server   namespace: kube-system spec:   ports:     - name: https       port: 443       protocol: TCP       targetPort: 443   selector:     k8s-app: metrics-server  --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata:   labels:     k8s-app: metrics-server     rbac.authorization.k8s.io/aggregate-to-admin: 'true'     rbac.authorization.k8s.io/aggregate-to-edit: 'true'     rbac.authorization.k8s.io/aggregate-to-view: 'true'   name: 'system:aggregated-metrics-reader'   namespace: kube-system rules:   - apiGroups:       - metrics.k8s.io     resources:       - pods       - nodes     verbs:       - get       - list       - watch  --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata:   labels:     k8s-app: metrics-server   name: 'system:metrics-server'   namespace: kube-system rules:   - apiGroups:       - ''     resources:       - pods       - nodes       - nodes/stats       - namespaces       - configmaps     verbs:       - get       - list       - watch  --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata:   labels:     k8s-app: metrics-server   name: 'metrics-server:system:auth-delegator'   namespace: kube-system roleRef:   apiGroup: rbac.authorization.k8s.io   kind: ClusterRole   name: 'system:auth-delegator' subjects:   - kind: ServiceAccount     name: metrics-server     namespace: kube-system  --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata:   labels:     k8s-app: metrics-server   name: 'system:metrics-server'   namespace: kube-system roleRef:   apiGroup: rbac.authorization.k8s.io   kind: ClusterRole   name: 'system:metrics-server' subjects:   - kind: ServiceAccount     name: metrics-server     namespace: kube-system  --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata:   labels:     k8s-app: metrics-server   name: metrics-server-auth-reader   namespace: kube-system roleRef:   apiGroup: rbac.authorization.k8s.io   kind: Role   name: extension-apiserver-authentication-reader subjects:   - kind: ServiceAccount     name: metrics-server     namespace: kube-system  --- apiVersion: v1 kind: ServiceAccount metadata:   labels:     k8s-app: metrics-server   name: metrics-server   namespace: kube-system  --- apiVersion: apiregistration.k8s.io/v1 kind: APIService metadata:   labels:     k8s-app: metrics-server   name: v1beta1.metrics.k8s.io   namespace: kube-system spec:   group: metrics.k8s.io   groupPriorityMinimum: 100   insecureSkipTLSVerify: true   service:     name: metrics-server     namespace: kube-system   version: v1beta1   versionPriority: 100  --- apiVersion: apps/v1 kind: Deployment metadata:   labels:     k8s-app: metrics-server   name: metrics-server   namespace: kube-system spec:   replicas: 2   selector:     matchLabels:       k8s-app: metrics-server   strategy:     rollingUpdate:       maxUnavailable: 1   template:     metadata:       labels:         k8s-app: metrics-server     spec:       affinity:         nodeAffinity:           preferredDuringSchedulingIgnoredDuringExecution:             - preference:                 matchExpressions:                   - key: node-role.kubernetes.io/master                     operator: Exists               weight: 100         podAntiAffinity:           requiredDuringSchedulingIgnoredDuringExecution:             - labelSelector:                 matchLabels:                   k8s-app: metrics-server               namespaces:                 - kube-system               topologyKey: kubernetes.io/hostname       containers:         - args:             - '--cert-dir=/tmp'             - '--secure-port=443'             - '--kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname'             - '--kubelet-use-node-status-port'             - '--kubelet-insecure-tls=true'             - '--authorization-always-allow-paths=/livez,/readyz'             - '--metric-resolution=15s'           image: >-             swr.cn-east-2.myhuaweicloud.com/kuboard-dependency/metrics-server:v0.5.0           imagePullPolicy: IfNotPresent           livenessProbe:             failureThreshold: 3             httpGet:               path: /livez               port: https               scheme: HTTPS             periodSeconds: 10           name: metrics-server           ports:             - containerPort: 443               name: https               protocol: TCP           readinessProbe:             failureThreshold: 3             httpGet:               path: /readyz               port: https               scheme: HTTPS             initialDelaySeconds: 20             periodSeconds: 10           resources:             requests:               cpu: 100m               memory: 200Mi           securityContext:             readOnlyRootFilesystem: true             runAsNonRoot: true             runAsUser: 1000           volumeMounts:             - mountPath: /tmp               name: tmp-dir       nodeSelector:         kubernetes.io/os: linux       priorityClassName: system-cluster-critical       serviceAccountName: metrics-server       tolerations:         - effect: ''           key: node-role.kubernetes.io/master           operator: Exists       volumes:         - emptyDir: {}           name: tmp-dir  --- apiVersion: policy/v1beta1 kind: PodDisruptionBudget metadata:   name: metrics-server   namespace: kube-system spec:   minAvailable: 1   selector:     matchLabels:       k8s-app: metrics-server

启动效果如下:

# 启动metrics-server

kubectl apply -f metrics-server.yaml

image.png

可以查看到服务器的内存,cpu等资源信息


10.NodePort端口

nodeport端口范围修改,k8s需要向外暴露端口,访问方式Service,需要对节点端口范围进行修改,默认是30000-32767,这里修改为1-65535

bash代码解读复制代码vi /etc/kubernetes/manifests/kube-apiserver.yaml

然后在Command下增加以下配置

  • --service-node-port-range=1-65535

image-20211111152942911.png

然后wq保存。 这个时候 k8s会自动重启,要等待一段时间。

直到你在服务器上敲入以下命令kubectl get all -n kube-system 所有状态都为running,即可。

image-20211111153030289.png

就可以了(但页面上还是会显示30000-32767,这个不管他,你照样设置想要的端口是可以保存成功的)

11.master去除污点

image-20211224104634601.png

image-20211224104726531.png

12.nodePort不可访问问题

通过setenforce 0 关闭SELinux是必须的,这样容器才可以访问主机的文件系统,例如pod的网络操作就需要访问主机文件系统。直到kubelet支持SELinux之前你都需要关闭SELinux。

iptables --flushiptables -tnat --flush是清空iptables的规则

css代码解读复制代码setenforce 0 iptables --flush iptables -tnat --flush service docker restart iptables -P FORWARD ACCEPT

13.scheduler出现Unhealthy

部署完master节点以后,执行kubectl get cs命令来检测组件的运行状态时,报如下错误

image-20211228101320792.png

原因分析

出现这种情况,是/etc/kubernetes/manifests/下的kube-scheduler.yaml设置的默认端口是0导致的,解决方式是注释掉对应的port即可,操作如下:

bash代码解读复制代码vi /etc/kubernetes/manifests/kube-scheduler.yaml  #注释下面 - --port=0这行,保存即可。

image-20211228101645584.png

保存完成功,不需要任何操作。等待kubelet重新检测完成即可。

image-20211228101838173.png 同样,如果controller-manager也出现Unhealthy的问题,也是按照同样的方式修改/etc/kubernetes/manifests/下的kube-controller-manager.yaml,注释掉对应的port即可。

14.安装ingress-nginx

为什么需要Ingress?

  • Service可以使用NodePort暴露集群外访问端口,但是性能低下不安全

  • 缺少Layer7的统一访问入口,可以负载均衡、限流等

  • Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义

的规则控制。

  • 我们使用Ingress作为整个集群统一的入口,配置Ingress规则转到对应的Service

image-20220104174104886.png

ingress nginx

安装文档

ingress-nginx文档说明

这是k8s官方做的,适配nginx的。这个里面会及时更新一些特性,而且性能很高,也被广泛采用。

在线安装:通过kubectl apply进行安装

bash代码解读复制代码kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.0/deploy/static/provider/cloud/deploy.yaml

离线安装:

下载好该deploy.yaml文件,修改名称为ingress-nginx.yaml

由于执行ingress-nginx.yaml,需要用到镜像,无法上网的,可以在有网的服务器先下载对应的镜像。

arduino代码解读复制代码cat ingress-nginx.yaml | grep image: | awk '{print $2}'

k8s.gcr.io/ingress-nginx/controller:v1.1.0@sha256:f766669fdcf3dc26347ed273a55e754b427eb4411ee075a53f30718b4499076a k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660

bash代码解读复制代码# 拉取全部镜像 cat ingress-nginx.yaml \     | grep image: \     | awk '{print "docker pull " $2}' \     | sh  # 当然你也可以一个一个pull      # 在当前目录导出镜像为压缩包 docker save -o ingress-nginx-controller-v1.1.0.tar k8s.gcr.io/ingress-nginx/controller:v1.1.0 docker save -o ingress-kube-webhook-certgen-v1.1.1.tar k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1  # 加载到docker环境 docker load -i ingress-nginx-controller-v1.1.0.tar docker load -i ingress-kube-webhook-certgen-v1.1.1.tar  # 安装calico kubectl apply -f ingress-nginx.yaml  # 删除calico kubectl delete -f ingress-nginx.yaml

注意,这里,ingress-nginx.yaml,需要修改里面的镜像名称。

bash代码解读复制代码image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660 #改为下面:(有两处地方需要修改) image: ingress/kube-webhook-certgen:v1.1.1  image: k8s.gcr.io/ingress-nginx/controller:v1.1.0@sha256:f766669fdcf3dc26347ed273a55e754b427eb4411ee075a53f30718b4499076a #改为下面: image: ingress/ingress-nginx-controller:v1.1.0

安装成功: image-20220105114730437.png

  • ingress配置

image-20220105114947977.png

yaml代码解读复制代码apiVersion: networking.k8s.io/v1 kind: Ingress metadata:   labels:     k8s.kuboard.cn/layer: svc     k8s.kuboard.cn/name: ureport   name: ureport   namespace: jxbp   resourceVersion: '1212113' spec:   ingressClassName: nginx   rules:     - host: www.jxbp.com       http:         paths:           - backend:               service:                 name: ureport                 port:                   number: 7302             path: /ureport             pathType: Prefix

测试:

bash代码解读复制代码curl -H "Host: www.llsydn.com" clusterIp  curl -H "Host: www.llsydn.com" 10.96.45.119/ureport


公司在IDC机房有两台很高配置的服务器,计划在上面部署openstack云平台虚拟化环境,用于承载后期开发测试和其他的一些对内业务。
以下对openstack的部署过程及其使用做一详细介绍,仅仅依据本人实际经验而述,如有不当,敬请指出~

********************************************************************************************************************************

1 OpenStack 介绍

1.1 百度百科OpenStack 是一个由 NASA ( 美国国家航空航天局)和 Rackspace 合作研发并发起的,以 Apache
许可证授权的自由软件和开放源代码项目。

1.2 版本历史

1.3 openstack 架构概念

1.4 openstack 各个服务名称对应

***************************************************************************************************************

以下安装部署已经过测试,完全通过!

建议在物理机上部署openstack,并且是centos7或ubuntu系统下,centos6x的源里已不支持openstack部分组件下载了。

2 环境准备openstack 主机名不能改,装的时候是什么就是什么, 运维标准化。

1、CentOS7.2 系统 2 台node1 即作为控制节点,也作为计算节点;(即可以单机部署,单机部署时则下面记录的控制节点和计算节点的操作步骤都要在本机执行下)
node2 就只是计算节点
控制节点去操控计算节点,计算节点上可以创建虚拟机

linux-node1.openstack   192.168.1.17 网卡 NAT em2     (外网ip假设是58.68.250.17)(em2是内网网卡,下面neutron配置文件里会设置到)
linux-node2.openstack   192.168.1.8   网卡 NAT em2

控制节点:linux-node1.openstack    192.168.1.17

计算节点:linux-node2.openstack 192.168.1.8

2.域名解析和关闭防火墙(控制节点和计算节点都做)/etc/hosts                                                         #主机名一开始设置好,后面就不能更改了,否则就会出问题!这里设置好ip与主机名的对应关系
192.168.1.17 linux-node1.openstack      
192.168.1.8   linux-node2.openstack  

关闭 selinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
setenforce 0
关闭 iptables
systemctl start firewalld.service
systemctl stop firewalld.service
systemctl disable firewalld.service

3 安装配置 OpenStack官方文档 http://docs.openstack.org/

3.1 安装软件包

linux-node1.openstack   安装

*************************************************************************************

#Base
yum install -y http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
yum install -y centos-release-openstack-liberty
yum install -y python-openstackclient

##MySQLyum install -y mariadb mariadb-server MySQL-python

##RabbitMQ
yum install -y rabbitmq-server

##Keystone
yum install -y openstack-keystone httpd mod_wsgi memcached python-memcached

##Glance
yum install -y openstack-glance python-glance python-glanceclient

##Nova
yum install -y openstack-nova-api openstack-nova-cert openstack-nova-conductor openstack-nova-console openstack-nova-novncproxy openstack-nova-scheduler python-novaclient

##Neutron linux-node1.example.com
yum install -y openstack-neutron openstack-neutron-ml2 openstack-neutron-linuxbridge python-neutronclient ebtables ipset

##Dashboard
yum install -y openstack-dashboard

##Cinder
yum install -y openstack-cinder python-cinderclient

*************************************************************************************

linux-node2.openstack   安装

##Base
yum install -y http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
yum install centos-release-openstack-liberty
yum install python-openstackclient

##Nova linux-node2.openstack
yum install -y openstack-nova-compute sysfsutils

##Neutron linux-node2.openstack
yum install -y openstack-neutron openstack-neutron-linuxbridge ebtables ipset

##Cinder
yum install -y openstack-cinder python-cinderclient targetcli python-oslo-policy

*************************************************************************************

3.2 设置时间同步、 关闭 selinux 和 iptables在 linux-node1 上配置( 只有 centos7 能用, 6 还用 ntp)[root@linux-node1 ~]# yum install -y chrony
[root@linux-node1 ~]# vim /etc/chrony.conf
allow 192.168/16 #允许那些服务器和自己同步时间
[root@linux-node1 ~]# systemctl enable chronyd.service    #开机启动
[root@linux-node1 ~]# systemctl start chronyd.service
[root@linux-node1 ~]# timedatectl set-timezone Asia/Shanghai     #设置时区
[root@linux-node1 ~]# timedatectl status
     Local time: Fri 2016-08-26 11:14:19 CST
 Universal time: Fri 2016-08-26 03:14:19 UTC
       RTC time: Fri 2016-08-26 03:14:19
      Time zone: Asia/Shanghai (CST, +0800)
    NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
     DST active: n/a

在 linux-node2 上配置[root@linux-node2 ~]# yum install -y chrony
[root@linux-node2 ~]# vim /etc/chrony.conf
server 192.168.1.17 iburst #只留一行
[root@linux-node2 ~]# systemctl enable chronyd.service
[root@linux-node2 ~]# systemctl start chronyd.service
[root@linux-node2 ~]# timedatectl set-timezone Asia/Shanghai
[root@linux-node2 ~]# chronyc sources

3.3 安装及配置 mysql

[root@linux-node1 ~]# cp /usr/share/mysql/my-medium.cnf /etc/my.cnf                   #或者是/usr/share/mariadb/my-medium.cnf
[mysqld]
default-storage-engine = innodb
innodb_file_per_table
collation-server = utf8_general_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8
[root@linux-node1 ~]# systemctl enable mariadb.service                                                      #Centos7里面mysql叫maridb
[root@linux-node1 ~]# ln -s '/usr/lib/systemd/system/mariadb.service' '/etc/systemd/system/multi-user.target.wants/mariadb.service'
[root@linux-node1 ~]# mysql_install_db --datadir="/var/lib/mysql" --user="mysql"               #初始化数据库[root@linux-node1 ~]# systemctl start mariadb.service
[root@linux-node1 ~]# mysql_secure_installation                                                                 #设置密码及初始化
密码 123456,一路 y 回车

创建数据库
[root@openstack-server ~]# mysql -p123456
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 5579
Server version: 5.5.50-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> CREATE DATABASE keystone;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'keystone';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'keystone';
MariaDB [(none)]> CREATE DATABASE glance;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'glance';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glance';
MariaDB [(none)]> CREATE DATABASE nova;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'nova';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'nova';
MariaDB [(none)]> CREATE DATABASE neutron;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'neutron';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'neutron';
MariaDB [(none)]> CREATE DATABASE cinder;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'cinder';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'cinder';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema   |
| cinder                       |
| glance                       |
| keystone                    |
| mysql                        |
| neutron                     |
| nova                         |
| performance_schema |
+--------------------+
8 rows in set (0.00 sec)

MariaDB [(none)]>

----------------------------------------------------------------------------------------------------------------------------
参考另一篇博客:http://www.cnblogs.com/kevingrace/p/5811167.html修改下mysql的连接数,否则openstack后面的操作会报错:“ERROR 1040 (08004): Too many connections ”
----------------------------------------------------------------------------------------------------------------------------

3.4 配置 rabbitmqMQ 全称为 Message Queue, 消息队列( MQ)是一种应用程序对应用程序的通信方法。应用
程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。
消 息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通
信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。
队列的使用除去了接收和发送应用程序同时执行的要求。
RabbitMQ 是一个在 AMQP 基础上完整的,可复用的企业消息系统。他遵循 Mozilla Public
License 开源协议。
启动 rabbitmq, 端口 5672,添加 openstack 用户

[root@linux-node1 ~]# systemctl enable rabbitmq-server.service
[root@linux-node1 ~]# ln -s '/usr/lib/systemd/system/rabbitmq-server.service' '/etc/systemd/system/multi-user.target.wants/rabbitmq-server.service'
[root@linux-node1 ~]# systemctl start rabbitmq-server.service
[root@linux-node1 ~]# rabbitmqctl add_user openstack openstack                               #添加用户及密码
[root@linux-node1 ~]# rabbitmqctl set_permissions openstack ".*" ".*" ".*"                                   #允许配置、写、读访问 openstack
[root@linux-node1 ~]# rabbitmq-plugins list                                 #查看支持的插件
.........
[ ] rabbitmq_management 3.6.2                                    #使用此插件实现 web 管理
.........
[root@linux-node1 ~]# rabbitmq-plugins enable rabbitmq_management     #启动插件
The following plugins have been enabled:
mochiweb
webmachine
rabbitmq_web_dispatch
amqp_client
rabbitmq_management_agent
rabbitmq_management
Plugin configuration has changed. Restart RabbitMQ for changes to take effect.
[root@linux-node1 ~]# systemctl restart rabbitmq-server.service

[root@linux-node1 ~]#lsof -i:15672

访问RabbitMQ,访问地址是http://58.68.250.17:15672
默认用户名密码都是guest,浏览器添加openstack用户到组并登陆测试,连不上情况一般是防火墙没有关闭所致!

之后退出使用 openstack 登录
如何使用 zabbix 监控?
左下角有 HTTP API 的介绍,可以实现 zabbix 的监控

*********************************************************************************************

以上完成基础环境的配置,下面开始安装 openstack 的组件

3.5 配置 Keystone 验证服务所有的服务,都需要在 keystone 上注册3.5.1 Keystone 介绍

3.5.2 配置 Keystone端口 5000 和 35357

1、修改/etc/keystone/keystone.conf
取一个随机数
[root@linux-node1 ~]# openssl rand -hex 10
35d6e6f377a889571bcf
[root@linux-node1 ~]# cat /etc/keystone/keystone.conf|grep -v "^#"|grep -v "^$"
[DEFAULT]
admin_token = 35d6e6f377a889571bcf                                    #设置 token,和上面产生的随机数值一致
verbose = true
[assignment]
[auth]
[cache]
[catalog]
[cors]
[cors.subdomain]
[credential]
[database]
connection = mysql://keystone:keystone@192.168.1.17/keystone                                          #设置数据库连接 写到database下
[domain_config]
[endpoint_filter]
[endpoint_policy]
[eventlet_server]
[eventlet_server_ssl]
[federation]
[fernet_tokens]
[identity]
[identity_mapping]
[kvs]
[ldap]
[matchmaker_redis]
[matchmaker_ring]
[memcache]
servers = 192.168.1.17:11211
[oauth1]
[os_inherit]
[oslo_messaging_amqp]
[oslo_messaging_qpid]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[paste_deploy]
[policy]
[resource]
[revoke]
driver = sql
[role]
[saml]
[signing]
[ssl]
[token]
provider = uuid
driver = memcache
[tokenless_auth]
[trust]

2、 创建数据库表, 使用命令同步
[root@linux-node1 ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone
No handlers could be found for logger "oslo_config.cfg"                                          #出现这个信息,不影响后续操作!忽略~

[root@linux-node1 ~]# ll /var/log/keystone/keystone.log
-rw-r--r--. 1 keystone keystone 298370 Aug 26 11:36 /var/log/keystone/keystone.log      #之所以上面 su 切换是因为这个日志文件属主
[root@linux-node1 config]# mysql -h 192.168.1.17 -u keystone -p      #数据库检查表,生产环境密码不要用keystone,改成复杂点的密码

3、 启动 memcached 和 apache
启动 memcached
[root@linux-node1 ~]# systemctl enable memcached
[root@linux-node1 ~]#ln -s '/usr/lib/systemd/system/memcached.service' '/etc/systemd/system/multi-user.target.wants/memcached.service'
[root@linux-node1 ~]# systemctl start memcached
配置 httpd
[root@linux-node1 ~]# vim /etc/httpd/conf/httpd.conf
ServerName 192.168.1.17:80
[root@linux-node1 ~]# cat /etc/httpd/conf.d/wsgi-keystone.conf
Listen 5000
Listen 35357

<VirtualHost *:5000>
  WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
  WSGIProcessGroup keystone-public
  WSGIScriptAlias / /usr/bin/keystone-wsgi-public
  WSGIApplicationGroup %{GLOBAL}
  WSGIPassAuthorization On
  <IfVersion >= 2.4>
    ErrorLogFormat "%{cu}t %M"
  </IfVersion>
  ErrorLog /var/log/httpd/keystone-error.log
  CustomLog /var/log/httpd/keystone-access.log combined
  <Directory /usr/bin>
  <IfVersion >= 2.4>
  Require all granted
  </IfVersion>
  <IfVersion < 2.4>
     Order allow,deny
     Allow from all
  </IfVersion>
  </Directory>
  </VirtualHost>

<VirtualHost *:35357>
  WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
  WSGIProcessGroup keystone-admin
  WSGIScriptAlias / /usr/bin/keystone-wsgi-admin
  WSGIApplicationGroup %{GLOBAL}
  WSGIPassAuthorization On
  <IfVersion >= 2.4>
    ErrorLogFormat "%{cu}t %M"
  </IfVersion>
  ErrorLog /var/log/httpd/keystone-error.log
  CustomLog /var/log/httpd/keystone-access.log combined
  <Directory /usr/bin>
  <IfVersion >= 2.4>
    Require all granted
  </IfVersion>
  <IfVersion < 2.4>
    Order allow,deny
    Allow from all
  </IfVersion>
  </Directory>
  </VirtualHost>

启动 httpd
[root@linux-node1 config]# systemctl enable httpd
[root@linux-node1 config]#ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service'
[root@linux-node1 config]# systemctl start httpd
[root@linux-node1 ~]# netstat -lntup|grep httpd
tcp6 0 0 :::5000 :::* LISTEN 23632/httpd
tcp6 0 0 :::80 :::* LISTEN 23632/httpd
tcp6 0 0 :::35357 :::* LISTEN 23632/httpd
如果 http 起不来关闭 selinux 或者安装 yum install openstack-selinux

4、 创建 keystone 用户
临时设置 admin_token 用户的环境变量,用来创建用户
[root@linux-node1 ~]# export OS_TOKEN=35d6e6f377a889571bcf                           #上面产生的随机数值
[root@linux-node1 ~]# export OS_URL=http://192.168.1.17:35357/v3
[root@linux-node1 ~]# export OS_IDENTITY_API_VERSION=3

创建 admin 项目---创建 admin 用户(密码 admin,生产不要这么玩) ---创建 admin 角色---把 admin 用户加入到 admin 项目赋予 admin 的角色(三个 admin 的位置:项目,用户,角色)
[root@linux-node1 ~]#openstack project create --domain default --description "Admin Project" admin
[root@linux-node1 ~]#openstack user create --domain default --password-prompt admin
[root@linux-node1 ~]#openstack role create admin
[root@linux-node1 ~]#openstack role add --project admin --user admin admin
创建一个普通用户 demo
[root@linux-node1 ~]#openstack project create --domain default --description "Demo Project" demo
[root@linux-node1 ~]#openstack user create --domain default --password=demo demo
[root@linux-node1 ~]#openstack role create user
[root@linux-node1 ~]#openstack role add --project demo --user demo user

创建 service 项目,用来管理其他服务用
[root@linux-node1 ~]#openstack project create --domain default --description "Service Project" service

以上的名字都是固定的,不能改

查看创建的而用户和项目
[root@linux-node1 ~]# openstack user list
+----------------------------------+-------+
| ID | Name |
+----------------------------------+-------+
| b1f164577a2d43b9a6393527f38e3f75 | demo |
| b694d8f0b70b41d883665f9524c77766 | admin |
+----------------------------------+-------+
[root@linux-node1 ~]# openstack project list
+----------------------------------+---------+
| ID | Name |
+----------------------------------+---------+
| 604f9f78853847ac9ea3c31f2c7f677d | demo |
| 777f4f0108b1476eabc11e00dccaea9f | admin |
| aa087f62f1d44676834d43d0d902d473 | service |
+----------------------------------+---------+
5、注册 keystone 服务,以下三种类型分别为公共的、内部的、管理的。[root@linux-node1 ~]#openstack service create --name keystone --description "OpenStack Identity" identity
[root@linux-node1 ~]#openstack endpoint create --region RegionOne identity public http://192.168.1.17:5000/v2.0
[root@linux-node1 ~]#openstack endpoint create --region RegionOne identity internal http://192.168.1.17:5000/v2.0
[root@linux-node1 ~]#openstack endpoint create --region RegionOne identity admin http://192.168.1.17:35357/v2.0
[root@linux-node1 ~]# openstack endpoint list       #查看
+----------------------------------+-----------+--------------+--------------+---------+----
-------+---------------------------------+
| ID | Region | Service Name | Service Type | Enabled |
Interface | URL |
+----------------------------------+-----------+--------------+--------------+---------+----
-------+---------------------------------+
| 011a24def8664506985815e0ed2f8fa5 | RegionOne | keystone | identity | True |
internal | http://192.168.1.17:5000/v2.0 |
| b0981cae6a8c4b3186edef818733fec6 | RegionOne | keystone | identity | True | public
| http://192.168.1.17:5000/v2.0 |
| c4e0c79c0a8142eda4d9653064563991 | RegionOne | keystone | identity | True | admin
| http://192.168.1.17:35357/v2.0 |
+----------------------------------+-----------+--------------+--------------+---------+----
-------+---------------------------------+
[root@linux-node1 ~]# openstack endpoint delete ID                                    #使用这个命令删除

6、 验证,获取 token,只有获取到才能说明 keystone 配置成功
[root@linux-node1 ~]# unset OS_TOKEN
[root@linux-node1 ~]# unset OS_URL
[root@linux-node1 ~]# openstack --os-auth-url http://192.168.1.17:35357/v3 --os-project-domain-id default --os-user-domain-id default --os-project-name admin --os-username admin --os-auth-type password token issue                   #回车
Password: admin
+------------+----------------------------------+
| Field | Value |
+------------+----------------------------------+
| expires | 2015-12-17T04:22:00.600668Z |
| id | 1b530a078b874438aadb77af11ce297e |
| project_id | 777f4f0108b1476eabc11e00dccaea9f |
| user_id | b694d8f0b70b41d883665f9524c77766 |
+------------+----------------------------------+

使用环境变量来获取 token,环境变量在后面创建虚拟机时也需要用。
创建两个环境变量文件,使用时直接 source!!!(注意,下面两个sh文件所在的路径,在查看命令前都要source下,不然会报错!!)
[root@linux-node1 ~]# cat admin-openrc.sh      
export OS_PROJECT_DOMAIN_ID=default
export OS_USER_DOMAIN_ID=default
export OS_PROJECT_NAME=admin
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_AUTH_URL=http://192.168.1.17:35357/v3
export OS_IDENTITY_API_VERSION=3

[root@linux-node1 ~]# cat demo-openrc.sh
export OS_PROJECT_DOMAIN_ID=default
export OS_USER_DOMAIN_ID=default
export OS_PROJECT_NAME=demo
export OS_TENANT_NAME=demo
export OS_USERNAME=demo
export OS_PASSWORD=demo
export OS_AUTH_URL=http://192.168.1.17:5000/v3
export OS_IDENTITY_API_VERSION=3
[root@linux-node1 ~]# source admin-openrc.sh
[root@linux-node1 ~]# openstack token issue
+------------+----------------------------------+
| Field | Value |
+------------+----------------------------------+
| expires | 2015-12-17T04:26:08.625399Z |
| id | 58370ae3b9bb4c07a67700dd184ad3b1 |
16
| project_id | 777f4f0108b1476eabc11e00dccaea9f |
| user_id | b694d8f0b70b41d883665f9524c77766 |
+------------+----------------------------------+

3.6 配置 glance 镜像服务3.6.1 glance 介绍

3.6.2 glance 配置端口:api            9191registry    92921、修改/etc/glance/glance-api.conf 和/etc/glance/glance-registry.conf
[root@linux-node1 ~]# cat /etc/glance/glance-api.conf|grep -v "^#"|grep -v "^$"
[DEFAULT]
verbose=True
notification_driver = noop                                           #galnce 不需要消息队列
[database]
connection=mysql://glance:glance@192.168.1.17/glance
[glance_store]
default_store=file
filesystem_store_datadir=/var/lib/glance/images/
[image_format]
[keystone_authtoken]
auth_uri = http://192.168.1.17:5000
auth_url = http://192.168.1.17:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = glance
password = glance
[matchmaker_redis]
[matchmaker_ring]
[oslo_concurrency]
[oslo_messaging_amqp]
[oslo_messaging_qpid]
[oslo_messaging_rabbit]
[oslo_policy]
[paste_deploy]
flavor=keystone
[store_type_location_strategy]
[task]
[taskflow_executor]

[root@linux-node1 ~]# cat /etc/glance/glance-registry.conf|grep -v "^#"|grep -v "^$"
[DEFAULT]
verbose=True
notification_driver = noop
[database]
connection=mysql://glance:glance@192.168.1.17/glance
[glance_store]
[keystone_authtoken]
auth_uri = http://192.168.1.17:5000
auth_url = http://192.168.1.17:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = glance
password = glance
[matchmaker_redis]
[matchmaker_ring]
[oslo_messaging_amqp]
[oslo_messaging_qpid]
[oslo_messaging_rabbit]
[oslo_policy]
[paste_deploy]
flavor=keystone

2、创建数据库表,同步数据库
[root@linux-node1 ~]# su -s /bin/sh -c "glance-manage db_sync" glance
[root@linux-node1 ~]# mysql -h 192.168.1.17 -uglance -p

3、 创建关于 glance 的 keystone 用户
[root@linux-node1 ~]# source admin-openrc.sh
[root@linux-node1 ~]# openstack user create --domain default --password=glance glance
[root@linux-node1 ~]# openstack role add --project service --user glance admin

4、启动 glance
[root@linux-node1 ~]#systemctl enable openstack-glance-api
[root@linux-node1 ~]#systemctl enable openstack-glance-registry
[root@linux-node1 ~]#systemctl start openstack-glance-api
[root@linux-node1 ~]#systemctl start openstack-glance-registry
[root@linux-node1 ~]# netstat -lnutp |grep 9191 #registry
tcp 0 0 0.0.0.0:9191 0.0.0.0:* LISTEN
24890/python2
[root@linux-node1 ~]# netstat -lnutp |grep 9292 #api
tcp 0 0 0.0.0.0:9292 0.0.0.0:* LISTEN
24877/python2

5、在 keystone 上注册
[root@linux-node1 ~]# source admin-openrc.sh
[root@linux-node1 ~]#openstack service create --name glance --description "OpenStack Image service" image
[root@linux-node1 ~]#openstack endpoint create --region RegionOne image public http://192.168.1.17:9292
[root@linux-node1 ~]#openstack endpoint create --region RegionOne image internal http://192.168.1.17:9292
[root@linux-node1 ~]#openstack endpoint create --region RegionOne image admin http://192.168.1.17:9292

6、添加 glance 环境变量并测试
[root@linux-node1 src]# echo "export OS_IMAGE_API_VERSION=2" | tee -a admin-openrc.sh demo-openrc.sh
[root@linux-node1 src]# glance image-list
+----+------+
| ID | Name |
+----+------+
+----+------+

7、 下载镜像并上传到 glance  【此处下载的qcow2格式镜像比较小,可以直接下载ios格式镜像,然后用oz工具制造】
[root@linux-node1 ~]# wget -q http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img   #也可以提前下载下来
[root@linux-node1 ~]# glance image-create --name "cirros" --file cirros-0.3.4-x86_64-disk.img --disk-format qcow2 --container-format bare --visibility public --progress
[=============================>] 100%
+------------------+--------------------------------------+
| Property | Value |
+------------------+--------------------------------------+
| checksum | ee1eca47dc88f4879d8a229cc70a07c6 |
| container_format | bare |
| created_at | 2015-12-17T04:11:02Z |
| disk_format | qcow2 |
| id | 2707a30b-853f-4d04-861d-e05b0f1855c8 |
| min_disk | 0 |
| min_ram | 0 |
| name | cirros |
| owner | 777f4f0108b1476eabc11e00dccaea9f |
| protected | False |
| size | 13287936 |
| status | active |
| tags | [] |
| updated_at | 2015-12-17T04:11:03Z |
| virtual_size | None |
| visibility | public |
+------------------+--------------------------------------+
-------------------------------------------------------------------------------------------------------------------------------
下载ios格式镜像,需要用OZ工具制造openstack镜像,具体操作请见另一篇博客:

实际生产环境下,肯定要使用ios镜像进行制作了

http://www.cnblogs.com/kevingrace/p/5821823.html

-------------------------------------------------------------------------------------------------------------------------------

或者直接下载centos的qcow2格式镜像进行上传,qcow2格式镜像直接就可以在openstack里使用,不需要进行格式转换!
下载地址:http://cloud.centos.org/centos,可以到里面下载centos5/6/7的qcow2格式的镜像

[root@linux-node1 ~]#wget http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2[root@linux-node1 ~]#glance image-create --name "CentOS-7-x86_64" --file CentOS-7-x86_64-GenericCloud.qcow2 --disk-format qcow2 --container-format bare --visibility public --progress

------------------------------------------------------------------------------------------------------------------------------

[root@linux-node1 ~]# glance image-list
+--------------------------------------+--------+
| ID | Name |
+--------------------------------------+--------+
| 2707a30b-853f-4d04-861d-e05b0f1855c8 | cirros |
+--------------------------------------+--------+

[root@linux-node1 ~]# ll /var/lib/glance/images/
总用量 12980
-rw-r-----. 1 glance glance 1569390592 Aug 26 12:50 35b36f08-eeb9-4a91-9366-561f0a308a1b

3.7 配置 nova 计算服务3.7.1 nova 介绍nova 必备的组件

nova scheduler

3.7.2 Nova 控制节点配置

1、修改/etc/nova/nova.conf
[root@linux-node1 ~]# cat /etc/nova/nova.conf|grep -v "^#"|grep -v "^$"
[DEFAULT]
my_ip=192.168.1.17
enabled_apis=osapi_compute,metadata
auth_strategy=keystone
network_api_class=nova.network.neutronv2.api.API
linuxnet_interface_driver=nova.network.linux_net.NeutronLinuxBridgeInterfaceDriver
security_group_api=neutron
firewall_driver = nova.virt.firewall.NoopFirewallDriver
debug=true
verbose=true
rpc_backend=rabbit
allow_resize_to_same_host=True
scheduler_default_filters=RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter
[api_database]
[barbican]
[cells]
[cinder]
[conductor]
[cors]
[cors.subdomain]
[database]
connection=mysql://nova:nova@192.168.1.17/nova
[ephemeral_storage_encryption]
[glance]
host=$my_ip
[guestfs]
[hyperv]
[image_file_url]
[ironic]
[keymgr]
[keystone_authtoken]
auth_uri = http://192.168.1.17:5000
auth_url = http://192.168.1.17:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = nova
password = nova
[libvirt]
virt_type=kvm #如果控制节点也作为计算节点(单机部署的话),这一行也添加上(这行是计算节点配置的)
[matchmaker_redis]
[matchmaker_ring]
[metrics]
[neutron]
url = http://192.168.1.17:9696
auth_url = http://192.168.1.17:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
region_name = RegionOne
project_name = service
username = neutron
password = neutron
service_metadata_proxy = True
metadata_proxy_shared_secret = neutron
lock_path=/var/lib/nova/tmp
[osapi_v21]
[oslo_concurrency]
[oslo_messaging_amqp]
[oslo_messaging_qpid]
[oslo_messaging_rabbit]
rabbit_host=192.168.1.17
rabbit_port=5672
rabbit_userid=openstack
rabbit_password=openstack
[oslo_middleware]
[rdp]
[serial_console]
[spice]
[ssl]
[trusted_computing]
[upgrade_levels]
[vmware]
[vnc]
novncproxy_base_url=http://58.68.250.17:6080/vnc_auto.html  #如果控制节点也作为计算节点(单机部署的话),这一行也添加上(这行是计算节点配置的),配置控制节点的公网ip
vncserver_listen= $my_ip
vncserver_proxyclient_address= $my_ip
keymap=en-us #如果控制节点也作为计算节点(单机部署的话),这一行也添加上(这行是计算节点配置的)
[workarounds]
[xenserver]
[zookeeper]

***********************************************************************
{网络部分为啥这么写:network_api_class=nova.network.neutronv2.api.API}
[root@linux-node1 ~]# ls /usr/lib/python2.7/site-packages/nova/network/neutronv2/api.py
/usr/lib/python2.7/site-packages/nova/network/neutronv2/api.py
这里面有一个 API 方法,其他配置类似
***********************************************************************

2、同步数据库
[root@linux-node1 ~]# su -s /bin/sh -c "nova-manage db sync" nova
[root@linux-node1 ~]# mysql -h 192.168.1.17 -unova -p 检查

3、创建 nova 的 keystone 用户
[root@linux-node1 ~]# openstack user create --domain default --password=nova nova
[root@linux-node1 ~]# openstack role add --project service --user nova admin

4、启动 nova 相关服务
[root@linux-node1 ~]#systemctl enable openstack-nova-api.service openstack-nova-cert.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
[root@linux-node1 ~]#systemctl start openstack-nova-api.service openstack-nova-cert.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service

5、在 keystone 上注册
[root@linux-node1 ~]# source admin-openrc.sh
[root@linux-node1 ~]# openstack service create --name nova --description "OpenStack Compute" compute
[root@linux-node1 ~]# openstack endpoint create --region RegionOne compute public http://192.168.1.17:8774/v2/%\(tenant_id\)s
[root@linux-node1 ~]# openstack endpoint create --region RegionOne compute internal http://192.168.1.17:8774/v2/%\(tenant_id\)s
[root@linux-node1 ~]# openstack endpoint create --region RegionOne compute admin http://192.168.1.17:8774/v2/%\(tenant_id\)s
检查
[root@linux-node1 ~]# openstack host list
+---------------------------+-------------+----------+
| Host Name | Service | Zone |
+---------------------------+-------------+----------+
| linux-node1.oldboyedu.com | conductor | internal |
| linux-node1.oldboyedu.com | scheduler | internal |
| linux-node1.oldboyedu.com | consoleauth | internal |
| linux-node1.oldboyedu.com | cert | internal |
+---------------------------+-------------+----------+

3.7.3   nova 计算节点配置1、 nova compute 介绍

2、修改配置文件/etc/nova/nova.conf可以直接从 node1 拷贝到 node2 上[root@linux-node1 ~]# scp /etc/nova/nova.conf 192.168.1.8:/etc/nova/
手动更改如下配置
[root@linux-node2 ~]# vim /etc/nova/nova.conf
my_ip=192.168.1.8
novncproxy_base_url=http://192.168.1.17:6080/vnc_auto.html
vncserver_listen=0.0.0.0
vncserver_proxyclient_address= $my_ip
keymap=en-us
[glance]
host=192.168.56.17
[libvirt]
virt_type=kvm                   #虚拟机类型,默认是 kvm

3、启动服务
[root@linux-node2 ~]# systemctl enable libvirtd openstack-nova-compute
[root@linux-node2 ~]# systemctl start libvirtd openstack-nova-compute

4、在控制节点测试(计算节点上也行,需要环境变量)[root@linux-node1 ~]# openstack host list
+---------------------------+-------------+----------+
| Host Name | Service | Zone |
+---------------------------+-------------+----------+
| linux-node1.oldboyedu.com | conductor | internal |
| linux-node1.oldboyedu.com | consoleauth | internal |
| linux-node1.oldboyedu.com | scheduler | internal |
| linux-node1.oldboyedu.com | cert | internal |
| linux-node2.oldboyedu.com | compute | nova |
+---------------------------+-------------+----------+

[root@linux-node1 ~]# nova image-list                  #测试 glance 是否正常
+--------------------------------------+--------+--------+--------+
| ID | Name | Status | Server |
+--------------------------------------+--------+--------+--------+
| 2707a30b-853f-4d04-861d-e05b0f1855c8 | cirros | ACTIVE | |
+--------------------------------------+--------+--------+--------+
[root@linux-node1 ~]# nova endpoints                     #测试 keystone
WARNING: keystone has no endpoint in ! Available endpoints for this service:           #这一行告警不影响后面的操作
+-----------+----------------------------------+
| keystone  | Value                            |
+-----------+----------------------------------+
| id        | 02fed35802734518922d0ca2d672f469 |
| interface | internal                         |
| region    | RegionOne                        |
| region_id | RegionOne                        |
| url       | http://192.168.1.17:5000/v2.0    |
+-----------+----------------------------------+
+-----------+----------------------------------+
| keystone  | Value                            |
+-----------+----------------------------------+
| id        | 52b0a1a700f04773a220ff0e365dea45 |
| interface | public                           |
| region    | RegionOne                        |
| region_id | RegionOne                        |
| url       | http://192.168.1.17:5000/v2.0    |
+-----------+----------------------------------+
+-----------+----------------------------------+
| keystone  | Value                            |
+-----------+----------------------------------+
| id        | 88df7df6427d45619df192979219e65c |
| interface | admin                            |
| region    | RegionOne                        |
| region_id | RegionOne                        |
| url       | http://192.168.1.17:35357/v2.0   |
+-----------+----------------------------------+
WARNING: nova has no endpoint in ! Available endpoints for this service:
+-----------+--------------------------------------------------------------+
| nova      | Value                                                        |
+-----------+--------------------------------------------------------------+
| id        | 1a3115941ff54b7499a800c7c43ee92a                             |
| interface | internal                                                     |
| region    | RegionOne                                                    |
| region_id | RegionOne                                                    |
| url       | http://192.168.1.17:8774/v2/65a0c00638c247a0a274837aa6eb165f |
+-----------+--------------------------------------------------------------+
+-----------+--------------------------------------------------------------+
| nova      | Value                                                        |
+-----------+--------------------------------------------------------------+
| id        | 5278f33a42754c9a8d90937932b8c0b3                             |
| interface | admin                                                        |
| region    | RegionOne                                                    |
| region_id | RegionOne                                                    |
| url       | http://192.168.1.17:8774/v2/65a0c00638c247a0a274837aa6eb165f |
+-----------+--------------------------------------------------------------+
+-----------+--------------------------------------------------------------+
| nova      | Value                                                        |
+-----------+--------------------------------------------------------------+
| id        | 8c4fa7b9a24949c5882949d13d161d36                             |
| interface | public                                                       |
| region    | RegionOne                                                    |
| region_id | RegionOne                                                    |
| url       | http://192.168.1.17:8774/v2/65a0c00638c247a0a274837aa6eb165f |
+-----------+--------------------------------------------------------------+
WARNING: glance has no endpoint in ! Available endpoints for this service:
+-----------+----------------------------------+
| glance    | Value                            |
+-----------+----------------------------------+
| id        | 31fbf72537a14ba7927fe9c7b7d06a65 |
| interface | admin                            |
| region    | RegionOne                        |
| region_id | RegionOne                        |
| url       | http://192.168.1.17:9292         |
+-----------+----------------------------------+
+-----------+----------------------------------+
| glance    | Value                            |
+-----------+----------------------------------+
| id        | be788b4aa2ce4251b424a3182d0eea11 |
| interface | public                           |
| region    | RegionOne                        |
| region_id | RegionOne                        |
| url       | http://192.168.1.17:9292         |
+-----------+----------------------------------+
+-----------+----------------------------------+
| glance    | Value                            |
+-----------+----------------------------------+
| id        | d0052712051a4f04bb59c06e2d5b2a0b |
| interface | internal                         |
| region    | RegionOne                        |
| region_id | RegionOne                        |
| url       | http://192.168.1.17:9292         |
+-----------+----------------------------------+

3.8 Neutron 网络服务3.8.1 Neutron 介绍neutron 由来

openstack 网络分类:

Neutron 组件

3.8.2 Neutron 控制节点配置( 5 个配置文件)1、修改/etc/neutron/neutron.conf文件

[root@linux-node1 ~]# cat /etc/neutron/neutron.conf|grep -v "^#"|grep -v "^$"
[DEFAULT]
state_path = /var/lib/neutron
core_plugin = ml2
service_plugins = router
auth_strategy = keystone
notify_nova_on_port_status_changes = True
notify_nova_on_port_data_changes = True
nova_url = http://192.168.1.17:8774/v2
rpc_backend=rabbit
[matchmaker_redis]
[matchmaker_ring]
[quotas]
[agent]
[keystone_authtoken]
auth_uri = http://192.168.1.17:5000
auth_url = http://192.168.1.17:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = neutron
password = neutron
admin_tenant_name = %SERVICE_TENANT_NAME%
admin_user = %SERVICE_USER%
admin_password = %SERVICE_PASSWORD%
[database]
connection = mysql://neutron:neutron@192.168.1.17:3306/neutron
[nova]
auth_url = http://192.168.1.17:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
region_name = RegionOne
project_name = service
username = nova
password = nova
[oslo_concurrency]
lock_path = $state_path/lock
[oslo_policy]
[oslo_messaging_amqp]
[oslo_messaging_qpid]
[oslo_messaging_rabbit]
rabbit_host = 192.168.1.17
rabbit_port = 5672
rabbit_userid = openstack
rabbit_password = openstack
[qos]

2、 配置/etc/neutron/plugins/ml2/ml2_conf.ini
[root@linux-node1 ~]# cat /etc/neutron/plugins/ml2/ml2_conf.ini|grep -v "^#"|grep -v "^$"
[ml2]
type_drivers = flat,vlan,gre,vxlan,geneve
tenant_network_types = vlan,gre,vxlan,geneve
mechanism_drivers = openvswitch,linuxbridge
extension_drivers = port_security
[ml2_type_flat]
flat_networks = physnet1
[ml2_type_vlan]
[ml2_type_gre]
[ml2_type_vxlan]
[ml2_type_geneve]
[securitygroup]
enable_ipset = True

3、配置/etc/neutron/plugins/ml2/ linuxbridge_agent.ini
[root@linux-node1 ~]# cat /etc/neutron/plugins/ml2/linuxbridge_agent.ini|grep -v "^#"|grep -v "^$"
[linux_bridge]
physical_interface_mappings = physnet1:em2
[vxlan]
enable_vxlan = false
[agent]
prevent_arp_spoofing = True
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
enable_security_group = True

4、修改/etc/neutron/dhcp_agent.ini
[root@linux-node1 ~]# cat /etc/neutron/dhcp_agent.ini|grep -v "^#"|grep -v "^$"
[DEFAULT]
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = true
[AGENT]

5、修改/etc/neutron/metadata_agent.ini
[root@linux-node1 ~]# cat /etc/neutron/metadata_agent.ini|grep -v "^#"|grep -v "^$"
[DEFAULT]
auth_uri = http://192.168.1.17:5000
auth_url = http://192.168.1.17:35357
auth_region = RegionOne
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = neutron
password = neutron
nova_metadata_ip = 192.168.1.17
metadata_proxy_shared_secret = neutron
admin_tenant_name = %SERVICE_TENANT_NAME%
admin_user = %SERVICE_USER%
admin_password = %SERVICE_PASSWORD%
[AGENT]

6、创建连接并创建 keystone 的用户
[root@linux-node1 ~]# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini
[root@linux-node1 ~]# openstack user create --domain default --password=neutron neutron
[root@linux-node1 ~]# openstack role add --project service --user neutron admin

7、更新数据库
[root@linux-node1 ~]# su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron

8、注册 keystone
[root@linux-node1 ~]# source admin-openrc.sh
[root@linux-node1 ~]# openstack service create --name neutron --description "OpenStack Networking" network
[root@linux-node1 ~]# openstack endpoint create --region RegionOne network public http://192.168.1.17:9696
[root@linux-node1 ~]# openstack endpoint create --region RegionOne network internal http://192.168.1.17:9696
[root@linux-node1 ~]# openstack endpoint create --region RegionOne network admin http://192.168.1.17:9696

9、 启动服务并检查
因为neutron和nova有联系,做neutron时修改nova的配置文件,上面nova.conf已经做了neutron的关联配置,所以要重启openstack-nova-api服务。
这里将nova的关联服务都一并重启了:
[root@linux-node1 ~]# systemctl restart openstack-nova-api.service openstack-nova-cert.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service

启动neutron相关服务
[root@linux-node1 ~]# systemctl enable neutron-server.service neutron-linuxbridge-agent.service neutron-dhcp-agent.service neutron-metadata-agent.service
[root@linux-node1 ~]# systemctl start neutron-server.service neutron-linuxbridge-agent.service neutron-dhcp-agent.service neutron-metadata-agent.service

检查
[root@linux-node1 ~]# neutron agent-list
+--------------------------------------+--------------------+------------------+-------+----------------+---------------------------+
| id                                   | agent_type         | host             | alive | admin_state_up | binary                    |
+--------------------------------------+--------------------+------------------+-------+----------------+---------------------------+
| 385cebf9-9b34-4eca-b780-c515dbc7eec0 | Linux bridge agent | openstack-server | :-)   | True           | neutron-linuxbridge-agent |
| b3ff8ffe-1ff2-4659-b823-331def4e6a93 | DHCP agent         | openstack-server | :-)   | True           | neutron-dhcp-agent        |
| b5bed625-47fd-4e79-aa55-01cf8a8cc577 | Metadata agent     | openstack-server | :-)   | True           | neutron-metadata-agent    |
+--------------------------------------+--------------------+------------------+-------+----------------+---------------------------+

查看注册信息
[root@openstack-server src]# openstack endpoint list
+----------------------------------+-----------+--------------+--------------+---------+-----------+-------------------------------------------+
| ID                               | Region    | Service Name | Service Type | Enabled | Interface | URL                                       |
+----------------------------------+-----------+--------------+--------------+---------+-----------+-------------------------------------------+
| 02fed35802734518922d0ca2d672f469 | RegionOne | keystone     | identity     | True    | internal  | http://192.168.1.17:5000/v2.0             |
| 1a3115941ff54b7499a800c7c43ee92a | RegionOne | nova         | compute      | True    | internal  | http://192.168.1.17:8774/v2/%(tenant_id)s |
| 31fbf72537a14ba7927fe9c7b7d06a65 | RegionOne | glance       | image        | True    | admin     | http://192.168.1.17:9292                  |
| 5278f33a42754c9a8d90937932b8c0b3 | RegionOne | nova         | compute      | True    | admin     | http://192.168.1.17:8774/v2/%(tenant_id)s |
| 52b0a1a700f04773a220ff0e365dea45 | RegionOne | keystone     | identity     | True    | public    | http://192.168.1.17:5000/v2.0             |
| 88df7df6427d45619df192979219e65c | RegionOne | keystone     | identity     | True    | admin     | http://192.168.1.17:35357/v2.0            |
| 8c4fa7b9a24949c5882949d13d161d36 | RegionOne | nova         | compute      | True    | public    | http://192.168.1.17:8774/v2/%(tenant_id)s |
| be788b4aa2ce4251b424a3182d0eea11 | RegionOne | glance       | image        | True    | public    | http://192.168.1.17:9292                  |
| c059a07fa3e141a0a0b7fc2f46ca922c | RegionOne | neutron      | network      | True    | public    | http://192.168.1.17:9696                  |
| d0052712051a4f04bb59c06e2d5b2a0b | RegionOne | glance       | image        | True    | internal  | http://192.168.1.17:9292                  |
| ea325a8a2e6e4165997b2e24a8948469 | RegionOne | neutron      | network      | True    | internal  | http://192.168.1.17:9696                  |
| ffdec11ccf024240931e8ca548876ef0 | RegionOne | neutron      | network      | True    | admin     | http://192.168.1.17:9696                  |
+----------------------------------+-----------+--------------+--------------+---------+-----------+-------------------------------------------+

3.8.3 Neutron 计算节点配置1、修改相关配置文件从 node1 上直接拷贝

[root@linux-node1 ~]# scp /etc/neutron/neutron.conf 192.168.1.8:/etc/neutron/
[root@linux-node1 ~]# scp /etc/neutron/plugins/ml2/linuxbridge_agent.ini 192.168.1.8:/etc/neutron/plugins/ml2/
[root@linux-node1 ~]# scp /etc/neutron/plugins/ml2/ml2_conf.ini 192.168.1.8:/etc/neutron/plugins/ml2/
修改计算节点的 nova 配置文件中 neutron 部分, 并重启 openstack-nova-compute 服务, 因为
上面 nova 计算节点也是从控制节点拷贝的,此处无需操作

2、 创建软连接并启动服务
[root@linux-node2 ~]# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini
[root@linux-node2 ~]# systemctl enable neutron-linuxbridge-agent.service
[root@linux-node2 ~]# systemctl start neutron-linuxbridge-agent.service

检查
[root@linux-node1 ~]# neutron agent-list
+--------------------------------------+--------------------+------------------+-------+----------------+---------------------------+
| id                                   | agent_type         | host             | alive | admin_state_up | binary                    |
+--------------------------------------+--------------------+------------------+-------+----------------+---------------------------+
| 385cebf9-9b34-4eca-b780-c515dbc7eec0 | Linux bridge agent | openstack-server | :-)   | True           | neutron-linuxbridge-agent |
| b3ff8ffe-1ff2-4659-b823-331def4e6a93 | DHCP agent         | openstack-server | :-)   | True           | neutron-dhcp-agent        |
| b5bed625-47fd-4e79-aa55-01cf8a8cc577 | Metadata agent     | openstack-server | :-)   | True           | neutron-metadata-agent    |
+--------------------------------------+--------------------+------------------+-------+----------------+---------------------------+

3.9 创建虚拟机3.9.1 创建桥接网络

1、 创建网络
[root@linux-node1 ~]# source admin-openrc.sh                     #在哪个项目下创建虚拟机,这里选择在demo下创建;也可以在admin下
[root@linux-node1 ~]# neutron net-create flat --shared --provider:physical_network physnet1 --provider:network_type flat

2、 创建子网(填写宿主机的内网网关,下面DNS和内网网关可以设置成宿主机的内网ip,下面192.168.1.100-200是分配给虚拟机的ip范围)
[root@linux-node1 ~]# neutron subnet-create flat 192.168.1.0/24 --name flat-subnet --allocation-pool start=192.168.1.100,end=192.168.1.200 --dns-nameserver 192.168.1.1 --gateway 192.168.1.1

3、 查看子网
[root@linux-node1 ~]# neutron net-list
+--------------------------------------+------+-----------------------------------------------------+
| id                                   | name | subnets                                             |
+--------------------------------------+------+-----------------------------------------------------+
| 1d9657f6-de9e-488f-911f-020c8622fe78 | flat | c53da14a-01fe-4f6c-8485-232489deaa6e 192.168.1.0/24 |
+--------------------------------------+------+-----------------------------------------------------+

[root@linux-node1 ~]# neutron subnet-list
+--------------------------------------+-------------+----------------+----------------------------------------------------+
| id                                   | name        | cidr           | allocation_pools                                   |
+--------------------------------------+-------------+----------------+----------------------------------------------------+
| c53da14a-01fe-4f6c-8485-232489deaa6e | flat-subnet | 192.168.1.0/24 | {"start": "192.168.1.100", "end": "192.168.1.200"} |
+--------------------------------------+-------------+----------------+----------------------------------------------------+
需要关闭 VMware 的 dhcp

3.9.2 创建虚拟机(为vm分配内网ip,后续利用squid代理或宿主机NAT端口转发进行对外或对内访问)1、创建 key
[root@linux-node1 ~]# source demo-openrc.sh               (这是在demo账号下创建虚拟机;要是在admin账号下创建虚拟机,就用source admin-openrc.sh)
[root@linux-node1 ~]# ssh-keygen -q -N ""

2、将公钥添加到虚拟机
[root@linux-node1 ~]# nova keypair-add --pub-key /root/.ssh/id_rsa.pub mykey
[root@linux-node1 ~]# nova keypair-list
+-------+-------------------------------------------------+
| Name | Fingerprint |
+-------+-------------------------------------------------+
| mykey | cd:7a:1e:cd:c0:43:9b:b1:f4:3b:cf:cd:5e:95:f8:00 |
+-------+-------------------------------------------------+

3、创建安全组
[root@linux-node1 ~]# nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0
[root@linux-node1 ~]# nova secgroup-add-rule default tcp 22 22 0.0.0.0/0

4、 创建虚拟机
查看支持的虚拟机类型
[root@linux-node1 ~]# nova flavor-list
+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+
| ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public |
+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+
| 1 | m1.tiny | 512 | 1 | 0 | | 1 | 1.0 | True |
| 2 | m1.small | 2048 | 20 | 0 | | 1 | 1.0 | True |
| 3 | m1.medium | 4096 | 40 | 0 | | 2 | 1.0 | True |
| 4 | m1.large | 8192 | 80 | 0 | | 4 | 1.0 | True |
| 5 | m1.xlarge | 16384 | 160 | 0 | | 8 | 1.0 | True |
+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+
查看镜像
[root@linux-node1 ~]# nova image-list
+--------------------------------------+--------+--------+--------+
| ID | Name | Status | Server |
+--------------------------------------+--------+--------+--------+
| 2707a30b-853f-4d04-861d-e05b0f1855c8 | cirros | ACTIVE | |
+--------------------------------------+--------+--------+--------+
查看网络
[root@linux-node1 ~]# neutron net-list
+--------------------------------------+------+-----------------------------------------------------+
| id                                   | name | subnets                                             |
+--------------------------------------+------+-----------------------------------------------------+
| 1d9657f6-de9e-488f-911f-020c8622fe78 | flat | c53da14a-01fe-4f6c-8485-232489deaa6e 192.168.1.0/24 |
+--------------------------------------+------+-----------------------------------------------------+

创建虚拟机 【这一步容易报错,一般都是由于上面的 nova.conf 配置填写有误所致】
[root@linux-node1 ~]# nova boot --flavor m1.tiny --image cirros --nic net-id=1d9657f6-de9e-488f-911f-020c8622fe78 --security-group default --key-name mykey hello-instance

5、查看虚拟机

[root@linux-node1 ~]# nova list
+--------------------------------------+---------------+--------+------------+-------------+--------------------+
| ID                                   | Name          | Status | Task State | Power State | Networks           |
+--------------------------------------+---------------+--------+------------+-------------+--------------------+
| 7a6215ac-aea7-4e87-99a3-b62c06d4610e | hello-instance| ACTIVE | -          | Running     | flat=192.168.1.102 |
+--------------------------------------+---------------+--------+------------+-------------+--------------------+

*************************************************************************
如果要删除虚拟机(利用虚拟机ID进行删除)
[root@linux-node1 ~]# nova delete 7a6215ac-aea7-4e87-99a3-b62c06d4610e
*************************************************************************

[root@linux-node1 src]# nova list
+--------------------------------------+----------------+--------+------------+-------------+--------------------+
| ID                                   | Name           | Status | Task State | Power State | Networks           |
+--------------------------------------+----------------+--------+------------+-------------+--------------------+
| 007db18f-ae3b-463a-b86d-9a8455a21e2d | hello-instance | ACTIVE | -          | Running     | flat=192.168.1.101 |
+--------------------------------------+----------------+--------+------------+-------------+--------------------+

[root@linux-node1 ~]# ssh cirros@192.168.1.101 登录查看

******************************************************************************

上面创建虚拟机的时候,openstack在neutron组网内是采用dhcp-agent自动分配ip的!

可以在创建虚拟机的时候,指定固定ip,方法详见于另一篇博客:

http://www.cnblogs.com/kevingrace/p/5822660.html

******************************************************************************

6、 web 界面打开虚拟机
[root@linux-node1 ~]# nova get-vnc-console hello-instance novnc
+-------+-----------------------------------------------------------------------------------
-+
| Type | Url
| +
-------+-----------------------------------------------------------------------------------
-+
| novnc | http://58.68.250.17:6080/vnc_auto.html?token=303d5a78-c85f-4ed9-93b6-be9d5d28fba6 |       #访问这个链接即可打开vnc界面
+-------+-----------------------------------------------------------------------------------
-+

4.0 安装 dashboard,登陆 web 管理界面[root@linux-node1 ~]# yum install openstack-dashboard -y
[root@linux-node1 ~]# vim /etc/openstack-dashboard/local_settings               #按照下面几行进行配置修改
OPENSTACK_HOST = "192.168.1.17"                                 #更改为keystone机器地址
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"              #默认的角色
ALLOWED_HOSTS = ['*']                                                 #允许所有主机访问
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '192.168.1.17:11211',                                   #连接memcached
}
}
#CACHES = {
# 'default': {
# 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
# }
#}
TIME_ZONE = "Asia/Shanghai"                        #设置时区

重启 httpd 服务
[root@linux-node1 ~]# systemctl restart httpd

web 界面登录访问dashboardhttp://58.68.250.17/dashboard/
用户密码 demo 或者 admin(管理员)

image.png

image.png

---------------------------------------------------------------------------------------------如果要修改dashboard的访问端口(比如将80端口改为8080端口),则需要修改下面两个配置文件:1)vim /etc/httpd/conf/httpd.conf
  将80端口修改为8080端口

Listen 8080
ServerName 192.168.1.17:8080

2)vim /etc/openstack-dashboard/local_settings      #将下面两处的端口由80改为8080
'from_port': '8080',
'to_port': '8080',

然后重启http服务:
systemctl restart httpd

如果开启了防火墙,还需要开通8080端口访问规则

这样,dashboard访问url:
http://58.68.250.17:8080/dashboard---------------------------------------------------------------------------------------------

前面建立了两个账号:admin 和 demo,两个账号都可以登陆web!只不过, admin 是管理员账号, admin 登陆后可以看到其他账号下的状态
demo 等普通账号登陆后只能看到自己的状态
注意:
上面的 Rabbit 账号 admin 和 openstack 是消息队列的 web 登陆账号。
比如一下子要建立 10 个虚拟机的指令,但是当前资源处理不过来,就通过 Rabbit 进行排队!!

-----------------------------------------------------------------------------------------------------------------------
修改OpenStack中dashboard用户登陆密码的方法:

登陆dashboard:

--------------------------------------------------------------------------------------------------------------------------------------------------

创建虚拟机的时候,我们可以自己定义虚拟机的类型(即配置)。

登陆openstack的web管理界面里进行自定义,也可以将之前的删除。

查看上传到glance的镜像

查看创建的虚拟机实例

自定义虚拟主机类型,设置如下:

(如果想让虚拟机有空闲磁盘空间,用于新建分区之用,则可以在这里分配临时磁盘)

我创建了四个虚拟机实例,采用的是同一个虚拟主机类型(即上面的kvm002),四个实例总共占用宿主机40G的空间。

image.png

image.png

登陆到openstack,可以看到,左侧一共有四个标签栏:

----------------------------------------------------------------------------------------------------------------------------------------------------
可以登陆dashboard界面,在“计算”->“实例”里选择“启动云主机"或者“计算->网络->网络拓扑”里选择“启动虚拟机”就可以再创建一个虚拟机
也可以按照快照再启动(创建)一个虚拟机,不过这样启动起来的虚拟机是一个新的ip(快照前的源虚拟机就要关机了)

查看实例,发现kvm-server005虚拟机已经创建成功了。默认创建后的ip是dhcp自动分配的,可以登陆虚拟机改成static静态ip

image.png

image.png

---------------------------------------------------------------------------------------------------------------------------------------------

在openstack 中重启实例有两种,分别被称为“软重启”和“硬重启”。所谓的软重启会尝试正常关机并重启实例,硬重启会直接将实例“断电”并重启。也就是说硬重启会“关闭”电源。其具体命令如下:
默认情况下,如果您通过nova重启,执行的是软重启。
$ nova reboot SERVER
如果您需要执行硬重启,添加--hard参数即可:
$ nova reboot --hard SERVER

nova命令管理虚拟机:

$ nova list                                      #查看虚拟机
$ nova stop [vm-name]或[vm-id]                   #关闭虚拟机
$ nova start [vm-name]或[vm-id]                  #启动虚拟机
$ nova suspend [vm-name]或[vm-id]                #暂停虚拟机
$ nova resume [vm-name]或[vm-id]                 #启动暂停的虚拟机
$ nova delete [vm-name]或[vm-id]                 #删除虚拟机

$nova-manage service list    #检查服务是否正常

[root@openstack-server ~]# source /usr/local/src/admin-openrc.sh
[root@openstack-server ~]# nova list
+--------------------------------------+----------------+--------+------------+-------------+--------------------+
| ID                                   | Name           | Status | Task State | Power State | Networks           |
+--------------------------------------+----------------+--------+------------+-------------+--------------------+
| 11e7ad7f-c0a8-482b-abca-3a4b7cfdd55d | hello-instance | ACTIVE | -          | Running     | flat=192.168.1.107 |
| 67f71703-c32c-4bf1-8778-b2a6600ad34a | kvm-server0    | ACTIVE | -          | Running     | flat=192.168.1.120 |
+--------------------------------------+----------------+--------+------------+-------------+--------------------+
[root@openstack-server ~]# ll /var/lib/nova/instances/           #下面是虚拟机的存放路径
total 8
drwxr-xr-x. 2 nova nova   85 Aug 29 15:22 11e7ad7f-c0a8-482b-abca-3a4b7cfdd55d
drwxr-xr-x. 2 nova nova   85 Aug 29 15:48 67f71703-c32c-4bf1-8778-b2a6600ad34a
drwxr-xr-x. 2 nova nova   80 Aug 29 15:40 _base
-rw-r--r--. 1 nova nova   39 Aug 29 16:44 compute_nodes
drwxr-xr-x. 2 nova nova 4096 Aug 29 13:58 locks

-----------------------------------------------------------------------------------------------------------------------------------
virsh命令行管理虚拟机:

[root@openstack-server ~]# virsh list    #查看虚拟机

Id    Name                           State
----------------------------------------------------
9     instance-00000008              running
41    instance-00000015              running
[root@openstack-server ~]# ll /etc/libvirt/qemu/   #虚拟机文件
total 16
-rw-------. 1 root root 4457 Aug 26 17:46 instance-00000008.xml
-rw-------. 1 root root 4599 Aug 29 15:40 instance-00000015.xml
drwx------. 3 root root   22 Aug 24 12:06 networks

其中:
virsh list #显示本地活动虚拟机
virsh list --all #显示本地所有的虚拟机(活动的+不活动的)
virsh define instance-00000015.xml #通过配置文件定义一个虚拟机(这个虚拟机还不是活动的)
virsh edit instance-00000015 # 编辑配置文件(一般是在刚定义完虚拟机之后)
virsh start instance-00000015 #启动名字为ubuntu的非活动虚拟机
virsh reboot instance-00000015 #重启虚拟机    
virsh create instance-00000015.xml #创建虚拟机(创建后,虚拟机立即执行,成为活动主机)
virsh suspend instance-00000015 #暂停虚拟机
virsh resume instance-00000015 #启动暂停的虚拟机
virsh shutdown instance-00000015 #正常关闭虚拟机
virsh destroy instance-00000015 #强制关闭虚拟机
virsh dominfo instance-00000015 #显示虚拟机的基本信息
virsh domname 2 #显示id号为2的虚拟机名
virsh domid instance-00000015 #显示虚拟机id号
virsh domuuid instance-00000015 #显示虚拟机的uuid
virsh domstate instance-00000015 #显示虚拟机的当前状态
virsh dumpxml instance-00000015 #显示虚拟机的当前配置文件(可能和定义虚拟机时的配置不同,因为当虚拟机启动时,需要给虚拟机分配id号、uuid、vnc端口号等等)
virsh setmem instance-00000015 512000 #给不活动虚拟机设置内存大小
virsh setvcpus instance-00000015 4 # 给不活动虚拟机设置cpu个数
virsh save instance-00000015 a  #将该instance-00000015虚拟机的运行状态存储到文件a中
virsh restore a    #恢复被存储状态的虚拟机的状态,即便虚拟机被删除也可以恢复(如果虚拟机已经被undefine移除,那么恢复的虚拟机也只是一个临时的状态,关闭后自动消失)
virsh undefine instance-00000015    #移除虚拟机,虚拟机处于关闭状态后还可以启动,但是被该指令删除后不能启动。在虚拟机处于Running状态时,调用该指令,该指令暂时不生效,但是当虚拟机被关闭后,该指令生效移除该虚拟机,也可以在该指令生效之前调用define+TestKVM.xml取消该指令

注意:
virsh destroy instance-00000015  这条命令并不是真正的删除这个虚拟机,只是将这个虚拟机强制关闭了。可以通过该虚拟机的xml文件恢复。如下:
[root@kvm-server ~]# virsh list
Id    Name                           State
----------------------------------------------------
1     dev-new-test2                  running
2     beta-new2                      running
5     test-server                    running
8     ubuntu-test03                  running
9     elk-node1                      running
10    elk-node2                      running
11    ubuntu-test01                  running
12    ubuntu-test02                  running

强制关闭虚拟机
[root@kvm-server ~]# virsh destroy ubuntu-test02
Domain ubuntu-test02 destroyed

发现ubuntu-test02虚拟机已经关闭了
[root@kvm-server ~]# virsh list
Id    Name                           State
----------------------------------------------------
1     dev-new-test2                  running
2     beta-new2                      running
5     test-server                    running
8     ubuntu-test03                  running
9     elk-node1                      running
10    elk-node2                      running
11    ubuntu-test01                  running

但是该虚拟机的xml文件还在,可以通过这个文件恢复
[root@kvm-server ~]# ll /etc/libvirt/qemu/ubuntu-test02.xml
-rw------- 1 root root 2600 Dec 26 13:55 /etc/libvirt/qemu/ubuntu-test02.xml
[root@kvm-server ~]# virsh define /etc/libvirt/qemu/ubuntu-test02.xml        #这只是重新添加了这个虚拟机,目前还不是活动的虚拟机,需要启动下
[root@kvm-server ~]# virsh start ubuntu-test02
Domain ubuntu-test02 started
[root@kvm-server ~]# virsh list
Id    Name                           State
----------------------------------------------------
1     dev-new-test2                  running
2     beta-new2                      running
5     test-server                    running
8     ubuntu-test03                  running
9     elk-node1                      running
10    elk-node2                      running
11    ubuntu-test01                  running
12    ubuntu-test02                  running



一、k8s 集群平台规划

k8s 集群可以有两种规划方式,单master集群多master集群

1. 单 master 集群

顾名思义该集群中只有一个 master 节点,在这样的集群规划中,如果 master 节点出了任何问题,它所管理的各个 node 节点都会受到影响,缺点是很明显的。

2. 多 master 集群(推荐)

包含多个 master 节点,在该集群中,master 通过负载均衡对 node 节点进行管理。

多 master 集群也称为高可用的 master 集群,即使其中一个 master 节点出现了问题,也不会影响到其他节点。

二、集群环境硬件配置要求

提示:由于此处是基于虚拟机进行演示操作的,所以以下配置适用于基于虚拟机的测试环境使用,如果是基于服务器生产环境则该配置需要更高。

master 节点:

  • CPU 两核及以上

  • 内存 4G 及以上

  • 硬盘 20G 及以上

node 节点,作为“具体做事”的节点,它的配置要求会更高:

  • CPU 四核及以上

  • 内存 8G 及以上

  • 硬盘 40G 及以上

三、k8s 集群搭建(Kubeadm 方式)

Kubeadm 是 k8s 的部署工具,它提供了 kubeadm initkubeadm join,专用于快速部署 k8s 集群,它能通过两条指令完成一个 Kubenetes 集群的搭建。Kubeadm 部署方式的优点是降低了部署门槛,部署方式快捷且简单;但缺点是屏蔽了诸多细节,遇到问题难以排查是哪里出现了问题。

注意:下文中的操作步骤,除特别说明在哪个节点操作之外,未说明的均表示该操作在所有节点都得执行。

1. 主机准备

准备三台虚拟机,分别安装 CentOS 系统。一台作为 master 节点,另两台作为 node 节点,且每台虚拟机有自己的专属 IP 地址。

虚拟机的创建和配置注意以下几点:

  • 硬件按照上文要求进行配置;

  • 虚拟机之间可以进行网络互通;

  • 虚拟机可以访问外网,便于下载镜像;

  • 安装好 wget 工具 yum install wget

  • 禁止 swap 分区。

2. 系统初始化

第一步:关闭防火墙

代码语言:javascript

复制

#临时关闭
systemctl stop firewalld
#永久关闭
systemctl disable firewalld

第二步:关闭 selinux

代码语言:javascript

复制

#永久关闭
sed -i '/selinux/s/enforcing/disabled/' /etc/selinux/config
#临时关闭
setenforce 0

第三步:关闭 swap

代码语言:javascript

复制

#临时关闭
swapoff -a
#永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab

第四步:设置主机名称,使用命令 hostnamectl set-hostname 主机名,如下三台主机分别设置为:

代码语言:javascript

复制

hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2

#查看当前主机名称
hostname

第五步:在master节点中添加 hosts,即节点 IP地址+节点名称;

代码语言:javascript

复制

cat >> /etc/hosts << EOF192.168.200.132 master192.168.200.133 node1192.168.200.134 node2EOF

第六步:将桥接的 IPv4 流量传递到 iptables 的链(所有节点都设置);

代码语言:javascript

复制

#设置
cat > /etc/sysctl.d/k8s.conf << EOFnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOF#使其生效
sysctl --system

第七步:时间同步,让各个节点(虚拟机)中的时间与本机时间保持一致。

代码语言:javascript

复制

yum install ntpdate -y
ntpdate time.windows.com

3. Docker 的安装

Kubernetes 默认容器运行时(CRI)为 Docker,所以需要先在各个节点中安装 Docker。
docker 的详细安装步骤往期文章已有讲述,此处不再赘述。详情参见:

【云原生 • Docker】docker 环境搭建、docker与容器常用指令大全

安装 Docker 后,之后的操作均需在 docker 服务开启的前提下进行 systemctl start docker

4. 添加 yum 源

此步骤是为了便于今后的下载,在每个节点中执行以下配置;

代码语言:javascript

复制

cat > /etc/yum.repos.d/kubernetes.repo << EOF[Kubernetes]name=kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpghttps://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF

5. kubeadm、kubelet、kubectl 的安装

此处指定版本为 1.18.0,如果不指定默认下载最新版本。

代码语言:javascript

复制

#下载软件
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0#开机自启动
systemctl enable kubelet

安装成功如下:

6. 在 Master 节点中部署集群

master 节点中执行以下命令,注意将 master 节点 IP 和 kube 版本号修改为自己主机中所对应的。

代码语言:javascript

复制

kubeadm init \--apiserver-advertise-address=192.168.200.132 \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version v1.18.0 \--service-cidr=10.96.0.0/12 \--pod-network-cidr=10.244.0.0/16

此步骤执行完成之后,使用命令docker images查看系统中的镜像,可以我们需要的镜像均已安装完成。

查看提示信息,看到 initialized successfully 说明我们 master 节点上的 k8s 集群已经搭建成功;

7. 将 node 节点加入集群

查看上一步执行成功后的提示信息,可以看到系统给了我们两条命令;

这两条命令分别表示:

① 开启 kubectl 工具的使用(该命令在master节点中执行)。

代码语言:javascript

复制

mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

② 将 node 节点加入 master 中的集群(该命令在工作节点node中执行)。

代码语言:javascript

复制

kubeadm join 192.168.200.132:6443 --token pahgrt.7gn13u88wz4f89an \    --discovery-token-ca-cert-hash sha256:7f73daa421d7564a6f813985a03f860350a923967d05cd955f8223d56200eb5b

分别在 master 节点中执行第 ① 条命令,在各个 node 节点中执行第 ② 条命令;

执行完成之后在 master 节点中使用命令 kubectl get nodes 查看此时集群中的工作节点。可以看到,node1 和 node2 工作节点已加入至 master 中的集群。

8. 部署 CNI 网络插件

在上述操作完成后,各个工作节点已经加入了集群,但是它们的状态都是 NoReady,这是由于无它们无法跨主机通信的原因。而 CNI 网络插件的主要功能就是实现 pod 资源能够跨宿主机进行通信。在master节点中执行以下命令进行配置:

代码语言:javascript

复制

kubectl apply -f https://docs.projectcalico.org/v3.10/manifests/calico.yaml

然后使用命令 kubectl get pods -n kube-system 查看运行状态,1 代表运行中;

最后再次使用kubectl get nodes查看集群中的工作节点;可以看到处于开机状态的 master 节点和 node2 节点已经是 ready 状态,处于关闭状态的 node1 节点为 NoReady 状态,测试无误。

Kubernetes 集群搭建完成。

四、方法总结

kubeadm 搭建 k8s 集群简单总结为以下几步:

  1. 准备虚拟机 3 台,分别安装 CentOS 操作系统,一台作为主控节点 master,两台作为工作节点 node;

  2. 对安装后的虚拟机进行初始化操作;

  3. 在所有的节点中安装 docker、kubeadm、kubelet、kubectl;

  4. 在 master 节点中使用 kubeadm init 命令部署集群;

  5. 在 node 节点中使用 kubeadm join 命令将 node 节点添加至集群;

  6. 部署网络插件 CNI。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/181778.html原文链接:https://javaforall.cn


运维,没你想的那么简单!

 

  • 一、前言

  • 二、基础环境部署

    • 1)前期准备(所有节点)

    • 2)安装容器 docker(所有节点)

    • 3)配置 k8s yum 源(所有节点)

    • 4)将 sandbox_image 镜像源设置为阿里云 google_containers 镜像源(所有节点)

    • 5)配置 containerd cgroup 驱动程序 systemd(所有节点)

    • 6)开始安装 kubeadm,kubelet 和 kubectl(master 节点)

    • 7)使用 kubeadm 初始化集群(master 节点)

    • 8)安装 Pod 网络插件(CNI:Container Network Interface)(master)

    • 9)node 节点加入 k8s 集群

    • 10)配置 IPVS

    • 11)集群高可用配置

    • 12)部署 Nginx+Keepalived 高可用负载均衡器

  • 三、k8s 管理平台 dashboard 环境部署

    • 1)dashboard 部署

    • 2)创建登录用户

    • 3)配置 hosts 登录 dashboard web

  • 四、k8s 镜像仓库 harbor 环境部署

    • 1)安装 helm

    • 2)配置 hosts

    • 3)创建 stl 证书

    • 4)安装 ingress

    • 5)安装 nfs

    • 6)创建 nfs provisioner 和持久化存储 SC

    • 7)部署 Harbor(Https 方式)

 

一、前言

官网:
官方文档:

二、基础环境部署

1)前期准备(所有节点)

1、修改主机名和配置 hosts

先部署 1master 和 2node 节点,后面再加一个 master 节点

# 在172.17.35.60执行
hostnamectl set-hostname  k8s-m60
# 在172.17.35.62执行
hostnamectl set-hostname k8s-n62
# 在172.17.35.63执行
hostnamectl set-hostname k8s-n63

配置 hosts

cat >> /etc/hosts<<EOF

172.17.35.60 k8s-m60 cluster-endpoint
172.17.35.62 k8s-n62
172.17.35.63 k8s-n63

EOF

2、配置 ssh 互信(不必须)

# 直接一直回车就行
ssh-keygen
ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-m60
ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-n62
ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-n63

3、时间同步

yum install chrony -y
systemctl start chronyd
systemctl enable chronyd
chronyc sources

4、关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

5、关闭 swap

# 临时关闭;关闭swap主要是为了性能考虑
swapoff -a
# 可以通过这个命令查看swap是否关闭了
free
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab

6、禁用 SELinux

# 临时关闭
setenforce 0
# 永久禁用
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

7、允许 iptables 检查桥接流量(可选,所有节点)

若要显式加载此模块,请运行 sudo modprobe br_netfilter,通过运行 lsmod | grep br_netfilter 来验证 br_netfilter 模块是否已加载,

sudo modprobe br_netfilter
lsmod | grep br_netfilter

为了让 Linux 节点的 iptables 能够正确查看桥接流量,请确认 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 设置为 1。例如:

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 应用 sysctl 参数而不重新启动
sudo sysctl --system

2)安装容器 docker(所有节点)

提示:v1.24 之前的 Kubernetes 版本包括与 Docker Engine 的直接集成,使用名为 dockershim 的组件。这种特殊的直接整合不再是 Kubernetes 的一部分 (这次删除被作为 v1.20 发行版本的一部分宣布)。你可以阅读检查 Dockershim 弃用是否会影响你 以了解此删除可能会如何影响你。要了解如何使用 dockershim 进行迁移,请参阅从 dockershim 迁移。
# 配置yum源
cd /etc/yum.repos.d ; mkdir bak; mv CentOS-Linux-* bak/
# centos7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# centos8
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
# 安装yum-config-manager配置工具
yum -y install yum-utils
# 设置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker-ce版本
yum install -y docker-ce
# 启动
systemctl start docker
# 开机自启
systemctl enable docker
# 查看版本号
docker --version
# 查看版本具体信息
docker version
# Docker镜像源设置
# 修改文件 /etc/docker/daemon.json,没有这个文件就创建
# 添加以下内容后,重启docker服务:
cat >/etc/docker/daemon.json<<EOF
{
   "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
EOF
# 加载
systemctl reload docker
# 查看
systemctl status docker containerd
【温馨提示】dockerd 实际真实调用的还是 containerd 的 api 接口,containerd 是 dockerd 和 runC 之间的一个中间交流组件。所以启动 docker 服务的时候,也会启动 containerd 服务的。

3)配置 k8s yum 源(所有节点)

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[k8s]
name=k8s
enabled=1
gpgcheck=0
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
EOF

4)将 sandbox_image 镜像源设置为阿里云 google_containers 镜像源(所有节点)

# 导出默认配置,config.toml这个文件默认是不存在的
containerd config default > /etc/containerd/config.toml
grep sandbox_image  /etc/containerd/config.toml
sed -i "s#k8s.gcr.io/pause#registry.aliyuncs.com/google_containers/pause#g"       /etc/containerd/config.toml
grep sandbox_image  /etc/containerd/config.toml

5)配置 containerd cgroup 驱动程序 systemd(所有节点)

kubernets 自v 1.24.0 后,就不再使用 docker.shim,替换采用 containerd 作为容器运行时端点。因此需要安装 containerd(在 docker 的基础下安装),上面安装 docker 的时候就自动安装了 containerd 了。这里的 docker 只是作为客户端而已。容器引擎还是 containerd。
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
# 应用所有更改后,重新启动containerd
systemctl restart containerd

6)开始安装 kubeadm,kubelet 和 kubectl(master 节点)

# 不指定版本就是最新版本,当前最新版就是1.24.1
yum install -y kubelet-1.24.1  kubeadm-1.24.1  kubectl-1.24.1 --disableexcludes=kubernetes
# disableexcludes=kubernetes:禁掉除了这个kubernetes之外的别的仓库
# 设置为开机自启并现在立刻启动服务 --now:立刻启动服务
systemctl enable --now kubelet

# 查看状态,这里需要等待一段时间再查看服务状态,启动会有点慢
systemctl status kubelet

查看日志,发现有报错,报错如下:

kubelet.service: Main process exited, code=exited, status=1/FAILURE kubelet.service: Failed with result 'exit-code'.

【解释】重新安装(或第一次安装)k8s,未经过 kubeadm init 或者 kubeadm join 后,kubelet 会不断重启,这个是正常现象……,执行 init 或 join 后问题会自动解决,对此官网有如下描述,也就是此时不用理会 kubelet.service。

查看版本

kubectl version
yum info kubeadm

7)使用 kubeadm 初始化集群(master 节点)

最好提前把镜像下载好,这样安装快

docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.24.1
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.24.1
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.24.1
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.24.1
docker pull registry.aliyuncs.com/google_containers/pause:3.7
docker pull registry.aliyuncs.com/google_containers/etcd:3.5.3-0
docker pull registry.aliyuncs.com/google_containers/coredns:v1.8.6

集群初始化

kubeadm init \
  --apiserver-advertise-address=172.17.35.60 \
  --image-repository registry.aliyuncs.com/google_containers \
  --control-plane-endpoint=cluster-endpoint \
  --kubernetes-version v1.24.1 \
  --service-cidr=10.1.0.0/16 \
  --pod-network-cidr=10.244.0.0/16 \
  --v=5
# –image-repository string:    这个用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers
# –kubernetes-version string:  指定kubenets版本号,默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,我们可以将其指定为固定版本(v1.22.1)来跳过网络请求。
# –apiserver-advertise-address  指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。这里的ip为master节点ip,记得更换。
# –pod-network-cidr             指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对  –pod-network-cidr有自己的要求,这里设置为10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。
# --control-plane-endpoint     cluster-endpoint 是映射到该 IP 的自定义 DNS 名称,这里配置hosts映射:192.168.0.113   cluster-endpoint。 这将允许你将 --control-plane-endpoint=cluster-endpoint 传递给 kubeadm init,并将相同的 DNS 名称传递给 kubeadm join。 稍后你可以修改 cluster-endpoint 以指向高可用性方案中的负载均衡器的地址。
【温馨提示】kubeadm 不支持将没有 --control-plane-endpoint 参数的单个控制平面集群转换为高可用性集群。
echo 'alias crictl="crictl  -r unix:///run/containerd/containerd.sock"' >> /root/.bash_profile 
alias crictl="crictl  -r unix:///run/containerd/containerd.sock"
crictl ps

重置再初始化

kubeadm reset
rm -fr ~/.kube/  /etc/kubernetes/* var/lib/etcd/*
kubeadm init \
  --apiserver-advertise-address=172.17.35.60  \
  --image-repository registry.aliyuncs.com/google_containers \
  --control-plane-endpoint=cluster-endpoint \
  --kubernetes-version v1.24.1 \
  --service-cidr=10.1.0.0/16 \
  --pod-network-cidr=10.244.0.0/16 \
  --v=5
# –image-repository string:    这个用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers
# –kubernetes-version string:  指定kubenets版本号,默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,我们可以将其指定为固定版本(v1.22.1)来跳过网络请求。
# –apiserver-advertise-address  指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。这里的ip为master节点ip,记得更换。
# –pod-network-cidr             指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对  –pod-network-cidr有自己的要求,这里设置为10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。
# --control-plane-endpoint     cluster-endpoint 是映射到该 IP 的自定义 DNS 名称,这里配置hosts映射:192.168.0.113   cluster-endpoint。 这将允许你将 --control-plane-endpoint=cluster-endpoint 传递给 kubeadm init,并将相同的 DNS 名称传递给 kubeadm join。 稍后你可以修改 cluster-endpoint 以指向高可用性方案中的负载均衡器的地址。

To start using your cluster, you need to run the following as a regular user:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

kubeadm join cluster-endpoint:6443 --token 4fiw5l.1nlred18x1pfjsks \
--discovery-token-ca-cert-hash sha256:bcafa0a398431a0813ebf0f7d529a4840d32dd3f280b00306fbbcfc5e1d73aab \
--control-plane

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join cluster-endpoint:6443 --token 4fiw5l.1nlred18x1pfjsks \
--discovery-token-ca-cert-hash sha256:bcafa0a398431a0813ebf0f7d529a4840d32dd3f280b00306fbbcfc5e1d73aab

配置环境变量

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 临时生效(退出当前窗口重连环境变量失效)
export KUBECONFIG=/etc/kubernetes/admin.conf
# 永久生效(推荐)
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source  ~/.bash_profile

 

 发现节点还是有问题,查看日志 /var/log/messages

"Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized"

 

接下来就是安装 Pod 网络插件

8)安装 Pod 网络插件(CNI:Container Network Interface)(master)

你必须部署一个基于 Pod 网络插件的 容器网络接口 (CNI),以便你的 Pod 可以相互通信。

# 最好提前下载镜像(所有节点)
docker pull quay.io/coreos/flannel:v0.14.0
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

如果上面安装失败,则下载我百度里的,离线安装

链接:
提取码:8888

再查看 node 节点,就已经正常了

 9)node 节点加入 k8s 集群

先安装 kubelet

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# 设置为开机自启并现在立刻启动服务 --now:立刻启动服务
systemctl enable --now kubelet
systemctl status kubelet

如果没有令牌,可以通过在控制平面节点上运行以下命令来获取令牌:

kubeadm token list

默认情况下,令牌会在24小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新令牌:

kubeadm token create
# 再查看
kubeadm token list

如果你没有 –discovery-token-ca-cert-hash 的值,则可以通过在控制平面节点上执行以下命令链来获取它:

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

如果执行 kubeadm init 时没有记录下加入集群的命令,可以通过以下命令重新创建(推荐)一般不用上面的分别获取 token 和 ca-cert-hash 方式,执行以下命令一气呵成:

kubeadm token create --print-join-command

这里需要等待一段时间,再查看节点节点状态,因为需要安装 kube-proxy 和 flannel。

kubectl get pods -A
kubectl get nodes

10)配置 IPVS

【问题】集群内无法 ping 通 ClusterIP(或 ServiceName)

1、加载 ip_vs 相关内核模块

modprobe -- ip_vs
modprobe -- ip_vs_sh
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr

所有节点验证开启了 ipvs:

lsmod |grep ip_vs

2、安装 ipvsadm 工具

yum install ipset ipvsadm -y

3、编辑 kube-proxy 配置文件,mode 修改成 ipvs

kubectl edit  configmap -n kube-system  kube-proxy

4、重启 kube-proxy

# 先查看
kubectl get pod -n kube-system | grep kube-proxy
# 再delete让它自拉起
kubectl get pod -n kube-system | grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
# 再查看
kubectl get pod -n kube-system | grep kube-proxy

5、查看 ipvs 转发规则

ipvsadm -Ln

11)集群高可用配置

配置高可用(HA)Kubernetes 集群实现的两种方案:

  • 使用堆叠(stacked)控制平面节点,其中 etcd 节点与控制平面节点共存(本章使用),架构图如下:

  • 使用外部 etcd 节点,其中 etcd 在与控制平面不同的节点上运行,架构图如下:

这里新增一台机器作为另外一个 master 节点:192.168.0.116 配置跟上面 master 节点一样。只是不需要最后一步初始化了。

1、修改主机名和配置 hosts

所有节点都统一如下配置:

# 在192.168.0.113执行
hostnamectl set-hostname  k8s-master-168-0-113
# 在192.168.0.114执行
hostnamectl set-hostname k8s-node1-168-0-114
# 在192.168.0.115执行
hostnamectl set-hostname k8s-node2-168-0-115
# 在192.168.0.116执行
hostnamectl set-hostname k8s-master2-168-0-116

配置 hosts

cat >> /etc/hosts<<EOF
192.168.0.113 k8s-master-168-0-113 cluster-endpoint
192.168.0.114 k8s-node1-168-0-114
192.168.0.115 k8s-node2-168-0-115
192.168.0.116 k8s-master2-168-0-116
EOF

2、配置 ssh 互信

# 直接一直回车就行
ssh-keygen
ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-master-168-0-113
ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-node1-168-0-114
ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-node2-168-0-115
ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-master2-168-0-116

3、时间同步

yum install chrony -y
systemctl start chronyd
systemctl enable chronyd
chronyc sources

7、关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

4、关闭 swap

# 临时关闭;关闭swap主要是为了性能考虑
swapoff -a
# 可以通过这个命令查看swap是否关闭了
free
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab

5、禁用 SELinux

# 临时关闭
setenforce 0
# 永久禁用
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

6、允许 iptables 检查桥接流量(可选,所有节点)

若要显式加载此模块,请运行 sudo modprobe br_netfilter,通过运行 lsmod | grep br_netfilter 来验证 br_netfilter 模块是否已加载,

sudo modprobe br_netfilter
lsmod | grep br_netfilter

为了让 Linux 节点的 iptables 能够正确查看桥接流量,请确认 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 设置为 1。例如:

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 应用 sysctl 参数而不重新启动
sudo sysctl --system

7、安装容器 docker(所有节点)

提示:v1.24 之前的 Kubernetes 版本包括与 Docker Engine 的直接集成,使用名为 dockershim 的组件。这种特殊的直接整合不再是 Kubernetes 的一部分 (这次删除被作为 v1.20 发行版本的一部分宣布)。你可以阅读检查 Dockershim 弃用是否会影响你 以了解此删除可能会如何影响你。要了解如何使用 dockershim 进行迁移,请参阅从 dockershim 迁移。
# 配置yum源
cd /etc/yum.repos.d ; mkdir bak; mv CentOS-Linux-* bak/
# centos7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# centos8
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo

# 安装yum-config-manager配置工具
yum -y install yum-utils
# 设置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker-ce版本
yum install -y docker-ce
# 启动
systemctl start docker
# 开机自启
systemctl enable docker
# 查看版本号
docker --version
# 查看版本具体信息
docker version

# Docker镜像源设置
# 修改文件 /etc/docker/daemon.json,没有这个文件就创建
# 添加以下内容后,重启docker服务:
cat >/etc/docker/daemon.json<<EOF
{
   "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
EOF
# 加载
systemctl reload docker

# 查看
systemctl status docker containerd
【温馨提示】dockerd 实际真实调用的还是 containerd 的 api 接口,containerd 是 dockerd 和 runC 之间的一个中间交流组件。所以启动 docker 服务的时候,也会启动 containerd 服务的。

8、配置 k8s yum 源(所有节点)

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[k8s]
name=k8s
enabled=1
gpgcheck=0
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
EOF

9、将 sandbox_image 镜像源设置为阿里云 google_containers 镜像源(所有节点)

# 导出默认配置,config.toml这个文件默认是不存在的
containerd config default > /etc/containerd/config.toml
grep sandbox_image  /etc/containerd/config.toml
sed -i "s#k8s.gcr.io/pause#registry.aliyuncs.com/google_containers/pause#g"       /etc/containerd/config.toml
grep sandbox_image  /etc/containerd/config.toml

10、配置 containerd cgroup 驱动程序 systemd

kubernets 自v 1.24.0 后,就不再使用 docker.shim,替换采用 containerd 作为容器运行时端点。因此需要安装 containerd(在 docker 的基础下安装),上面安装 docker 的时候就自动安装了 containerd 了。这里的 docker 只是作为客户端而已。容器引擎还是 containerd。
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
# 应用所有更改后,重新启动containerd
systemctl restart containerd

11、开始安装 kubeadm,kubelet 和 kubectl(master 节点)

# 不指定版本就是最新版本,当前最新版就是1.24.1
yum install -y kubelet-1.24.1  kubeadm-1.24.1  kubectl-1.24.1 --disableexcludes=kubernetes
# disableexcludes=kubernetes:禁掉除了这个kubernetes之外的别的仓库
# 设置为开机自启并现在立刻启动服务 --now:立刻启动服务
systemctl enable --now kubelet

# 查看状态,这里需要等待一段时间再查看服务状态,启动会有点慢
systemctl status kubelet

# 查看版本

kubectl version
yum info kubeadm

12、加入 k8s 集群

# 证如果过期了,可以使用下面命令生成新证书上传,这里会打印出certificate key,后面会用到
kubeadm init phase upload-certs --upload-certs
# 你还可以在 【init】期间指定自定义的 --certificate-key,以后可以由 join 使用。 要生成这样的密钥,可以使用以下命令(这里不执行,就用上面那个自命令就可以了):
kubeadm certs certificate-key

kubeadm token create --print-join-command

kubeadm join cluster-endpoint:6443 --token wswrfw.fc81au4yvy6ovmhh --discovery-token-ca-cert-hash sha256:43a3924c25104d4393462105639f6a02b8ce284728775ef9f9c30eed8e0abc0f --control-plane --certificate-key 8d2709697403b74e35d05a420bd2c19fd8c11914eb45f2ff22937b245bed5b68

# --control-plane 标志通知 kubeadm join 创建一个新的控制平面。加入master必须加这个标记
# --certificate-key ... 将导致从集群中的 kubeadm-certs Secret 下载控制平面证书并使用给定的密钥进行解密。这里的值就是上面这个命令(kubeadm init phase upload-certs --upload-certs)打印出的key。

 


根据提示执行如下命令:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看

kubectl get nodes
kubectl get pods -A -owide

 


虽然现在已经有两个 master 了,但是对外还是只能有一个入口的,所以还得要一个负载均衡器,如果一个 master 挂了,会自动切到另外一个 master 节点。

12)部署 Nginx+Keepalived 高可用负载均衡器

1、安装 Nginx 和 Keepalived

# 在两个master节点上执行
yum install nginx keepalived -y

2、Nginx 配置

在两个 master 节点配置

cat > /etc/nginx/nginx.conf << "EOF"
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
# 四层负载均衡,为两台Master apiserver组件提供负载均衡
stream {
    log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
    access_log  /var/log/nginx/k8s-access.log  main;
    upstream k8s-apiserver {
    # Master APISERVER IP:PORT
       server 192.168.0.113:6443;
    # Master2 APISERVER IP:PORT
       server 192.168.0.116:6443;
    }
    server {
       listen 16443;
       proxy_pass k8s-apiserver;
    }
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    server {
        listen       80 default_server;
        server_name  _;

        location / {
        }
    }
}
EOF
【温馨提示】如果只保证高可用,不配置 k8s-apiserver 负载均衡的话,可以不装 nginx,但是最好还是配置一下 k8s-apiserver 负载均衡。

3、Keepalived 配置(master)

cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from fage@qq.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id NGINX_MASTER
}
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
    priority 100    # 优先级,备服务器设置 90
    advert_int 1    # 指定VRRP 心跳包通告间隔时间,默认1秒
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟IP
    virtual_ipaddress {
        192.168.0.120/24
    }
    track_script {
        check_nginx
    }
}
EOF
  • vrrp_script:指定检查 nginx 工作状态脚本(根据 nginx 状态判断是否故障转移)

  • virtual_ipaddress:虚拟 IP(VIP)

检查 nginx 状态脚本:

cat > /etc/keepalived/check_nginx.sh  << "EOF"
#!/bin/bash
count=$(ps -ef |grep nginx |egrep -cv "grep|$$")

if [ "$count" -eq 0 ];then
    exit 1
else
    exit 0
fi
EOF
chmod +x /etc/keepalived/check_nginx.sh

4、Keepalived 配置(backup)

cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from fage@qq.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id NGINX_BACKUP
}
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.120/24
    }
    track_script {
        check_nginx
    }
}
EOF

检查 nginx 状态脚本:

cat > /etc/keepalived/check_nginx.sh  << "EOF"
#!/bin/bash
count=$(ps -ef |grep nginx |egrep -cv "grep|$$")

if [ "$count" -eq 0 ];then
    exit 1
else
    exit 0
fi
EOF
chmod +x /etc/keepalived/check_nginx.sh

5、启动并设置开机启动

systemctl daemon-reload
systemctl restart nginx && systemctl enable nginx && systemctl status nginx
systemctl restart keepalived && systemctl enable keepalived && systemctl status keepalived

查看 VIP

ip a

6、修改 hosts(所有节点)

将 cluster-endpoint 之前执行的 ip 修改执行现在的 VIP

192.168.0.113 k8s-master-168-0-113
192.168.0.114 k8s-node1-168-0-114
192.168.0.115 k8s-node2-168-0-115
192.168.0.116 k8s-master2-168-0-116
192.168.0.120 cluster-endpoint

7、测试验证

查看版本(负载均衡测试验证)

curl -k https://cluster-endpoint:16443/version

 


高可用测试验证,将 k8s-master-168-0-113 节点关机

shutdown -h now
curl -k https://cluster-endpoint:16443/version
kubectl get nodes -A
kubectl get pods -A
【温馨提示】堆叠集群存在耦合失败的风险。如果一个节点发生故障,则 etcd 成员和控制平面实例都将丢失, 并且冗余会受到影响。你可以通过添加更多控制平面节点来降低此风险。

三、k8s 管理平台 dashboard 环境部署

1)dashboard 部署

GitHub 地址:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.0/aio/deploy/recommended.yaml
kubectl get pods -n kubernetes-dashboard

但是这个只能内部访问,所以要外部访问,要么部署 ingress,要么就是设置 service NodePort 类型。这里选择 service 暴露端口。

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.0/aio/deploy/recommended.yaml

修改后的内容如下:

# Copyright 2017 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

apiVersion: v1
kind: Namespace
metadata:
  name: kubernetes-dashboard

---

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard

---

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 31443
  selector:
    k8s-app: kubernetes-dashboard

---

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-certs
  namespace: kubernetes-dashboard
type: Opaque

---

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-csrf
  namespace: kubernetes-dashboard
type: Opaque
data:
  csrf: ""

---

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-key-holder
  namespace: kubernetes-dashboard
type: Opaque

---

kind: ConfigMap
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-settings
  namespace: kubernetes-dashboard

---

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
rules:
  # Allow Dashboard to get, update and delete Dashboard exclusive secrets.
  - apiGroups: [""]
    resources: ["secrets"]
    resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]
    verbs: ["get", "update", "delete"]
    # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
  - apiGroups: [""]
    resources: ["configmaps"]
    resourceNames: ["kubernetes-dashboard-settings"]
    verbs: ["get", "update"]
    # Allow Dashboard to get metrics.
  - apiGroups: [""]
    resources: ["services"]
    resourceNames: ["heapster", "dashboard-metrics-scraper"]
    verbs: ["proxy"]
  - apiGroups: [""]
    resources: ["services/proxy"]
    resourceNames: ["heapster", "http:heapster:", "https:heapster:", "dashboard-metrics-scraper", "http:dashboard-metrics-scraper"]
    verbs: ["get"]

---

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
rules:
  # Allow Metrics Scraper to get metrics from the Metrics server
  - apiGroups: ["metrics.k8s.io"]
    resources: ["pods", "nodes"]
    verbs: ["get", "list", "watch"]

---

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: kubernetes-dashboard
subjects:
  - kind: ServiceAccount
    name: kubernetes-dashboard
    namespace: kubernetes-dashboard

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kubernetes-dashboard
subjects:
  - kind: ServiceAccount
    name: kubernetes-dashboard
    namespace: kubernetes-dashboard

---

kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: kubernetes-dashboard
  template:
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
    spec:
      securityContext:
        seccompProfile:
          type: RuntimeDefault
      containers:
        - name: kubernetes-dashboard
          image: kubernetesui/dashboard:v2.6.0
          imagePullPolicy: Always
          ports:
            - containerPort: 8443
              protocol: TCP
          args:
            - --auto-generate-certificates
            - --namespace=kubernetes-dashboard
            # Uncomment the following line to manually specify Kubernetes API server Host
            # If not specified, Dashboard will attempt to auto discover the API server and connect
            # to it. Uncomment only if the default does not work.
            # - --apiserver-host=http://my-address:port
          volumeMounts:
            - name: kubernetes-dashboard-certs
              mountPath: /certs
              # Create on-disk volume to store exec logs
            - mountPath: /tmp
              name: tmp-volume
          livenessProbe:
            httpGet:
              scheme: HTTPS
              path: /
              port: 8443
            initialDelaySeconds: 30
            timeoutSeconds: 30
          securityContext:
            allowPrivilegeEscalation: false
            readOnlyRootFilesystem: true
            runAsUser: 1001
            runAsGroup: 2001
      volumes:
        - name: kubernetes-dashboard-certs
          secret:
            secretName: kubernetes-dashboard-certs
        - name: tmp-volume
          emptyDir: {}
      serviceAccountName: kubernetes-dashboard
      nodeSelector:
        "kubernetes.io/os": linux
      # Comment the following tolerations if Dashboard must not be deployed on master
      tolerations:
        - key: node-role.kubernetes.io/master
          effect: NoSchedule

---

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: dashboard-metrics-scraper
  name: dashboard-metrics-scraper
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 8000
      targetPort: 8000
  selector:
    k8s-app: dashboard-metrics-scraper

---

kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    k8s-app: dashboard-metrics-scraper
  name: dashboard-metrics-scraper
  namespace: kubernetes-dashboard
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: dashboard-metrics-scraper
  template:
    metadata:
      labels:
        k8s-app: dashboard-metrics-scraper
    spec:
      securityContext:
        seccompProfile:
          type: RuntimeDefault
      containers:
        - name: dashboard-metrics-scraper
          image: kubernetesui/metrics-scraper:v1.0.8
          ports:
            - containerPort: 8000
              protocol: TCP
          livenessProbe:
            httpGet:
              scheme: HTTP
              path: /
              port: 8000
            initialDelaySeconds: 30
            timeoutSeconds: 30
          volumeMounts:
          - mountPath: /tmp
            name: tmp-volume
          securityContext:
            allowPrivilegeEscalation: false
            readOnlyRootFilesystem: true
            runAsUser: 1001
            runAsGroup: 2001
      serviceAccountName: kubernetes-dashboard
      nodeSelector:
        "kubernetes.io/os": linux
      # Comment the following tolerations if Dashboard must not be deployed on master
      tolerations:
        - key: node-role.kubernetes.io/master
          effect: NoSchedule
      volumes:
        - name: tmp-volume
          emptyDir: {}

 


重新部署

kubectl delete -f recommended.yaml
kubectl apply -f recommended.yaml
kubectl get svc,pods -n kubernetes-dashboard

2)创建登录用户

cat >ServiceAccount.yaml<<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF
kubectl apply -f ServiceAccount.yaml

创建并获取登录 token

kubectl -n kubernetes-dashboard create token admin-user

3)配置 hosts 登录 dashboard web

192.168.0.120 cluster-endpoint

登录:

 

输入上面创建的 token 登录

 

四、k8s 镜像仓库 harbor 环境部署

GitHub 地址:
这使用 helm 安装,所以得先安装 helm

1)安装 helm

mkdir -p /opt/k8s/helm && cd /opt/k8s/helm
wget https://get.helm.sh/helm-v3.9.0-rc.1-linux-amd64.tar.gz
tar -xf helm-v3.9.0-rc.1-linux-amd64.tar.gz
ln -s /opt/k8s/helm/linux-amd64/helm /usr/bin/helm
helm version
helm help

2)配置 hosts

192.168.0.120 myharbor.com

3)创建 stl 证书

mkdir /opt/k8s/helm/stl && cd /opt/k8s/helm/stl
# 生成 CA 证书私钥
openssl genrsa -out ca.key 4096
# 生成 CA 证书
openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=harbor/OU=harbor/CN=myharbor.com" \
 -key ca.key \
 -out ca.crt
# 创建域名证书,生成私钥
openssl genrsa -out myharbor.com.key 4096
# 生成证书签名请求 CSR
openssl req -sha512 -new \
    -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=harbor/OU=harbor/CN=myharbor.com" \
    -key myharbor.com.key \
    -out myharbor.com.csr
# 生成 x509 v3 扩展
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=myharbor.com
DNS.2=*.myharbor.com
DNS.3=hostname
EOF
#创建 Harbor 访问证书
openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in myharbor.com.csr \
    -out myharbor.com.crt

4)安装 ingress

ingress 官方网站:
ingress 仓库地址:
部署文档:

1、通过 helm 部署

helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --create-namespace

2、通过 YAML 文件安装(本章使用这个方式安装 ingress)

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml

如果下载镜像失败,可以用以下方式修改镜像地址再安装

# 可以先把镜像下载,再安装
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.2.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml
# 修改镜像地址
sed -i 's@k8s.gcr.io/ingress-nginx/controller:v1.2.0\(.*\)@registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.2.0@' deploy.yaml
sed -i 's@k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1\(.*\)$@registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1@' deploy.yaml

###还需要修改两地方
#1、kind: 类型修改成DaemonSet,replicas: 注销掉,因为DaemonSet模式会每个节点运行一个pod
#2、在添加一条:hostnetwork:true
#3、把LoadBalancer修改成NodePort
#4、在--validating-webhook-key下面添加- --watch-ingress-without-class=true
#5、设置master节点可调度
kubectl taint nodes k8s-master-168-0-113 node-role.kubernetes.io/control-plane:NoSchedule-
kubectl taint nodes k8s-master2-168-0-116 node-role.kubernetes.io/control-plane:NoSchedule-

kubectl apply -f deploy.yaml

5)安装 nfs

1、所有节点安装 nfs

yum -y install  nfs-utils rpcbind

2、在 master 节点创建共享目录并授权

mkdir /opt/nfsdata
# 授权共享目录
chmod 666 /opt/nfsdata

3、配置 exports 文件

cat > /etc/exports<<EOF
/opt/nfsdata *(rw,no_root_squash,no_all_squash,sync)
EOF
# 配置生效
exportfs -r

exportfs 命令

常用选项
-a 全部挂载或者全部卸载
-r 重新挂载
-u 卸载某一个目录
-v 显示共享目录 以下操作在服务端上

4、启动 rpc 和 nfs(客户端只需要启动 rpc 服务)(注意顺序)

systemctl start rpcbind
systemctl start nfs-server
systemctl enable rpcbind
systemctl enable nfs-server

查看

showmount -e
# VIP
showmount -e 192.168.0.120
-e 显示 NFS 服务器的共享列表
-a 显示本机挂载的文件资源的情况 NFS 资源的情况
-v 显示版本号

5、客户端

# 安装
yum -y install  nfs-utils rpcbind
# 启动rpc服务
systemctl start rpcbind
systemctl enable rpcbind
# 创建挂载目录
mkdir /mnt/nfsdata
# 挂载
echo "192.168.0.120:/opt/nfsdata /mnt/nfsdata     nfs    defaults  0 1">> /etc/fstab
mount -a

6、rsync 数据同步

【1】rsync 安装

# 两端都得安装
yum -y install rsync

【2】配置

在/etc/rsyncd.conf 中添加

cat >/etc/rsyncd.conf<<EOF
uid = root
gid = root
#禁锢在源目录
use chroot = yes
#监听地址
address = 192.168.0.113
#监听地址tcp/udp 873,可通过cat /etc/services | grep rsync查看
port 873
#日志文件位置
log file = /var/log/rsyncd.log
#存放进程 ID 的文件位置
pid file = /var/run/rsyncd.pid
#允许访问的客户机地址
hosts allow = 192.168.0.0/16
#共享模块名称
[nfsdata]
#源目录的实际路径
path = /opt/nfsdata
comment = Document Root of www.kgc.com
#指定客户端是否可以上传文件,默认对所有模块为 true
read only = yes
#同步时不再压缩的文件类型
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z
#授权账户,多个账号以空格分隔,不加则为匿名,不依赖系统账号
auth users = backuper
#存放账户信息的数据文件
secrets file = /etc/rsyncd_users.db
EOF

配置 rsyncd_users.db

cat >/etc/rsyncd_users.db<<EOF
backuper:123456
EOF
#官方要求,最好只是赋权600!
chmod 600 /etc/rsyncd_users.db

【3】rsyncd.conf 常用参数详解

rsyncd.conf 参数

rsyncd.conf 参数参数说明
uid=rootrsync 使用的用户。
gid=rootrsync 使用的用户组(用户所在的组)
use chroot=no如果为 true,daemon 会在客户端传输文件前“chroot to the path”。这是一种安全配置,因为我们大多数都在内网,所以不配也没关系
max connections=200设置最大连接数,默认 0,意思无限制,负值为关闭这个模块
timeout=400默认为 0,表示 no timeout,建议 300-600(5-10 分钟)
pid filersync daemon 启动后将其进程 pid 写入此文件。如果这个文件存在,rsync 不会覆盖该文件,而是会终止
lock file指定 lock 文件用来支持“max connections”参数,使得总连接数不会超过限制
log file不设或者设置错误,rsync 会使用 rsyslog 输出相关日志信息
ignore errors忽略 I/O 错误
read only=false指定客户端是否可以上传文件,默认对所有模块为 true
list=false是否允许客户端可以查看可用模块列表,默认为可以
hosts allow指定可以联系的客户端主机名或和 ip 地址或地址段,默认情况没有此参数,即都可以连接
hosts deny指定不可以联系的客户端主机名或 ip 地址或地址段,默认情况没有此参数,即都可以连接
auth users指定以空格或逗号分隔的用户可以使用哪些模块,用户不需要在本地系统中存在。默认为所有用户无密码访问
secrets file指定用户名和密码存放的文件,格式;用户名;密码,密码不超过 8 位
[backup]这里就是模块名称,需用中括号扩起来,起名称没有特殊要求,但最好是有意义的名称,便于以后维护
path这个模块中,daemon 使用的文件系统或目录,目录的权限要注意和配置文件中的权限一致,否则会遇到读写的问题

【4】rsync 常用命令参数详解

rsync --help

rsync [选项]  原始位置   目标位置

常用选项    说明
-r    递归模式,包含目录及子目录中的所有文件
-l    对于符号链接文件仍然复制为符号链接文件
-v    显示同步过程的详细信息
-z    在传输文件时进行压缩goD
-p    保留文件的权限标记
-a    归档模式,递归并保留对象属性,等同于-rlpt
-t    保留文件的时间标记
-g    保留文件的属组标记(仅超级用户使用)
-o    保留文件的属主标记(仅超级用户使用)
-H    保留硬链接文件
-A    保留ACL属性信息
-D    保留设备文件及其他特殊文件
--delete  删除目标位置有而原始位置没有的文件
--checksum  根据对象的校验和来决定是否跳过文件

【5】启动服务(数据源机器)

#rsync监听端口:873
#rsync运行模式:C/S
rsync --daemon --config=/etc/rsyncd.conf
netstat -tnlp|grep :873

【6】执行命令同步数据

# 在目的机器上执行
# rsync -avz 用户名@源主机地址/源目录 目的目录
rsync -avz root@192.168.0.113:/opt/nfsdata/* /opt/nfsdata/

【7】crontab 定时同步

# 配置crontab, 每五分钟同步一次,这种方式不好
*/5 * * * * rsync -avz root@192.168.0.113:/opt/nfsdata/* /opt/nfsdata/
【温馨提示】crontab 定时同步数据不太好,可以使用rsync+inotify做数据实时同步,这里篇幅有点长了,先不讲,如果后面有时间会出一篇单独文章来讲。

6)创建 nfs provisioner 和持久化存储 SC

【温馨提示】这里跟我之前的文章有点不同,之前的方式也不适用新版本。

GitHub 地址:

helm 部署 nfs-subdir-external-provisioner

1、添加 helm 仓库

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

2、helm 安装 nfs provisioner

【温馨提示】默认镜像是无法访问的,这里使用 dockerhub 搜索到的镜像willdockerhub/nfs-subdir-external-provisioner:v4.0.2,还有就是 StorageClass 不分命名空间,所有在所有命名空间下都可以使用。
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
  --namespace=nfs-provisioner \
  --create-namespace \
  --set image.repository=willdockerhub/nfs-subdir-external-provisioner \
  --set image.tag=v4.0.2 \
  --set replicaCount=2 \
  --set storageClass.name=nfs-client \
  --set storageClass.defaultClass=true \
  --set nfs.server=192.168.0.120 \
  --set nfs.path=/opt/nfsdata
【温馨提示】上面 nfs.server 设置为 VIP,可实现高可用。

3、查看

kubectl get pods,deploy,sc -n nfs-provisioner

7)部署 Harbor(Https 方式)

1、创建 Namespace

kubectl create ns harbor

2、创建证书秘钥

kubectl create secret tls myharbor.com --key myharbor.com.key --cert myharbor.com.crt -n harbor
kubectl get secret myharbor.com -n harbor

3、添加 Chart 库

helm repo add harbor https://helm.goharbor.io

4、通过 helm 安装 harbor

helm install myharbor --namespace harbor harbor/harbor \
  --set expose.ingress.hosts.core=myharbor.com \
  --set expose.ingress.hosts.notary=notary.myharbor.com \
  --set-string expose.ingress.annotations.'nginx\.org/client-max-body-size'="1024m" \
  --set expose.tls.secretName=myharbor.com \
  --set persistence.persistentVolumeClaim.registry.storageClass=nfs-client \
  --set persistence.persistentVolumeClaim.jobservice.storageClass=nfs-client \
  --set persistence.persistentVolumeClaim.database.storageClass=nfs-client \
  --set persistence.persistentVolumeClaim.redis.storageClass=nfs-client \
  --set persistence.persistentVolumeClaim.trivy.storageClass=nfs-client \
  --set persistence.persistentVolumeClaim.chartmuseum.storageClass=nfs-client \
  --set persistence.enabled=true \
  --set externalURL=https://myharbor.com \
  --set harborAdminPassword=Harbor12345

这里稍等一段时间在查看资源状态

kubectl get ingress,svc,pods,pvc -n harbor

5、ingress 没有 ADDRESS 问题解决

【分析】,发现"error: endpoints “default-http-backend” not found"

cat << EOF > default-http-backend.yaml
---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: default-http-backend
  labels:
    app: default-http-backend
  namespace: harbor
spec:
  replicas: 1
  selector:
    matchLabels:
      app: default-http-backend
  template:
    metadata:
      labels:
        app: default-http-backend
    spec:
      terminationGracePeriodSeconds: 60
      containers:
      - name: default-http-backend
        # Any image is permissible as long as:
        # 1. It serves a 404 page at /
        # 2. It serves 200 on a /healthz endpoint
        image: registry.cn-hangzhou.aliyuncs.com/google_containers/defaultbackend:1.4
#        image: gcr.io/google_containers/defaultbackend:1.4
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 30
          timeoutSeconds: 5
        ports:
        - containerPort: 8080
        resources:
          limits:
            cpu: 10m
            memory: 20Mi
          requests:
            cpu: 10m
            memory: 20Mi
---

apiVersion: v1
kind: Service
metadata:
  name: default-http-backend
  namespace: harbor
  labels:
    app: default-http-backend
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: default-http-backend
EOF
kubectl apply -f default-http-backend.yaml

6、卸载重新部署

# 卸载
helm uninstall myharbor -n harbor
kubectl get pvc -n harbor| awk 'NR!=1{print $1}' | xargs kubectl delete pvc -n harbor

# 部署
helm install myharbor --namespace harbor harbor/harbor \
  --set expose.ingress.hosts.core=myharbor.com \
  --set expose.ingress.hosts.notary=notary.myharbor.com \
  --set-string expose.ingress.annotations.'nginx\.org/client-max-body-size'="1024m" \
  --set expose.tls.secretName=myharbor.com \
  --set persistence.persistentVolumeClaim.registry.storageClass=nfs-client \
  --set persistence.persistentVolumeClaim.jobservice.storageClass=nfs-client \
  --set persistence.persistentVolumeClaim.database.storageClass=nfs-client \
  --set persistence.persistentVolumeClaim.redis.storageClass=nfs-client \
  --set persistence.persistentVolumeClaim.trivy.storageClass=nfs-client \
  --set persistence.persistentVolumeClaim.chartmuseum.storageClass=nfs-client \
  --set persistence.enabled=true \
  --set externalURL=https://myharbor.com \
  --set harborAdminPassword=Harbor12345

5、访问 harbor


账号/密码:admin/Harbor12345

 

6、harbor 常见操作

【1】创建项目 bigdata

【2】配置私有仓库

在文件/etc/docker/daemon.json添加如下内容:

"insecure-registries":["https://myharbor.com"]

重启 docker

systemctl restart docker

【3】服务器上登录 harbor

docker login https://myharbor.com
#账号/密码:admin/Harbor12345

【4】打标签并把镜像上传到 harbor

docker tag rancher/pause:3.6 myharbor.com/bigdata/pause:3.6
docker push myharbor.com/bigdata/pause:3.6

7、修改 containerd 配置

以前使用 docker-engine 的时候,只需要修改/etc/docker/daemon.json 就行,但是新版的 k8s 已经使用 containerd 了,所以这里需要做相关配置,要不然 containerd 会失败。证书(ca.crt)可以在页面上下载:


创建域名目录

mkdir /etc/containerd/myharbor.com
cp ca.crt /etc/containerd/myharbor.com/

配置文件:/etc/containerd/config.toml

[plugins."io.containerd.grpc.v1.cri".registry]
      config_path = ""

      [plugins."io.containerd.grpc.v1.cri".registry.auths]

      [plugins."io.containerd.grpc.v1.cri".registry.configs]
        [plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor.com".tls]
          ca_file = "/etc/containerd/myharbor.com/ca.crt"
        [plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor.com".auth]
          username = "admin"
          password = "Harbor12345"

      [plugins."io.containerd.grpc.v1.cri".registry.headers]

      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."myharbor.com"]
          endpoint = ["https://myharbor.com"]

 


重启 containerd

#重新加载配置
systemctl daemon-reload
#重启containerd
systemctl restart containerd

简单使用

# 把docker换成crictl 就行,命令都差不多
crictl pull myharbor.com/bigdata/mysql:5.7.38

执行 crictl 报如下错误的解决办法

WARN[0000] image connect using default endpoints: [unix:///var/run/dockershim.sock unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock]. As the default settings are now deprecated, you should set the endpoint instead.
ERRO[0000] unable to determine image API version: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial unix /var/run/dockershim.sock: connect: no such file or directory"

这个报错是 docker 的报错,这里没使用,所以这个错误不影响使用,但是还是解决好点,解决方法如下:

cat <<EOF> /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

再次拉取镜像

crictl pull myharbor.com/bigdata/mysql:5.7.38

Kubernetes(k8s)最新版最完整版基础环境部署+master 高可用实现详细步骤就到这里了


目录


Kubernetes的功能:


Kubernetes的特点:


1. 安装要求


2. 部署内容


1、系统环境准备


2、所有禁用swap和本地解析


3、仓库配置,所有安装docker


4、所有节点设定docker的资源管理模式为systemd


5、所有阶段复制harbor仓库中的证书并启动docker 


6、安装K8S部署工具


7、设置kubectl命令补齐功能


8、在所有节点安装cri-docker


9、在master节点拉取K8S所需镜像


10、集群初始化


11、安装flannel网络插件


12、节点扩容


Kubernetes,简称K8s,是由Google在2014年开源的容器集群管理系统。它是基于Google内部使用的Borg系统多年经验开发而成的,旨在帮助用户轻松管理和部署容器化应用程序。Kubernetes具有高度可扩展、自动化和便携性,使其成为现代云原生应用的事实标准。


Kubernetes的功能:

快速部署应用:通过声明式配置,Kubernetes可以快速地将应用程序部署到集群中。

快速扩展应用:Kubernetes可以根据应用负载自动或手动进行横向扩展。

无缝对接新的应用功能:通过滚动更新和回滚功能,Kubernetes能够确保服务的持续可用性。

节省资源,优化硬件资源的使用:Kubernetes的高效调度机制能够最大化硬件资源的利用率。

Kubernetes的特点:

可移植性:Kubernetes支持多种云平台和裸机环境,允许用户在公有云、私有云、混合云甚至多重云环境中无缝迁移和运行。

可扩展性:Kubernetes的架构是模块化的,支持插件化和可组合性,允许用户根据需要添加或自定义功能。

自动化:Kubernetes提供了自动化的部署、重启、复制和扩展/伸缩功能,极大地简化了运维工作。

1. 安装要求

在开始部署Kubernetes集群之前,以下条件必须得到满足:


操作系统:所有节点需要运行CentOS 7.7或更高版本的64位操作系统。

硬件配置:

内存:至少2GB RAM。

CPU:至少2个CPU核心。

硬盘空间:至少30GB可用空间。

网络配置:所有节点必须能够互相通信,且不需要NAT或端口映射。

互联网访问:节点需要能够访问互联网,以便下载Docker镜像和Kubernetes组件。

swap分区:建议关闭swap分区,因为Kubernetes推荐在物理内存不足时进行Pod驱逐,而不是使用swap。

2. 部署内容

软件版本:Kubernetes v1.16.2和Docker v19.03。

部署步骤:

在所有节点上安装Docker和Kubernetes的核心组件,如kubeadm和kubelet。

初始化集群并部署Kubernetes Master,这是集群的控制平面。

部署容器网络插件,以实现Pod之间以及Pod与外部世界的通信。

将Kubernetes Node加入到集群中,Node是执行应用程序的工作节点。

以下是详细的部署步骤:


1、系统环境准备

主机 IP

k8s-master 172.25.254.100

k8s-node1 172.25.254.10

k8s-node2 172.25.254.20

harbor 172.25.254.254

2、所有禁用swap和本地解析

[root@k8s-node1 ~]# systemctl mask swap.target

Created symlink /etc/systemd/system/swap.target → /dev/null.

[root@k8s-node1 ~]# swapoff -a

[root@k8s-node1 ~]# vim /etc/fstab



vim /etc/hosts






3、仓库配置,所有安装docker

vim /etc/yum.repos.d/docker.repo




dnf install docker-ce -y




4、所有节点设定docker的资源管理模式为systemd



vim /etc/yum.repos.d/rhel9.repo


 


5、所有阶段复制harbor仓库中的证书并启动docker 


[root@k8s-hub certs]# for ip in 172.25.254.10 172.25.254.20 172.25.254.100; do

 scp -r 172.25.254.254:/etc/docker/certs.d/reg.cfy.org/ ${ip}:/etc/docker/certs.d/reg.cfy.org/

done





docker info




vim /root/harbor/harbor.yml




docker login reg.cfy.org




6、安装K8S部署工具

#部署软件仓库,添加K8S源

vim /etc/yum.repos.d/k8s.repo

[k8s]

name=k8s

baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm

gpgcheck=0


#安装软件

dnf install kubelet-1.30.0 kubeadm-1.30.0 kubectl-1.30.0 -y




7、设置kubectl命令补齐功能

dnf install bash-completion -y

echo "source <(kubectl completion bash)" >> ~/.bashrc

source ~/.bashrc




8、在所有节点安装cri-docker

k8s从1.24版本开始移除了dockershim,所以需要安装cri-docker插件才能使用docker 软件下载:https://github.com/Mirantis/cri-dockerd


 dnf install libcgroup-0.41-19.el8.x86_64.rpm cri-dockerd-0.3.14-3.el8.x86_64.rpm -y




vim /lib/systemd/system/cri-docker.service


ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd://  --network-plugin=cni --pod-infra-container-image=reg.cfy.org/k8s/pause:3.9




systemctl daemon-reload

systemctl start cri-docker

ll /var/run/cri-dockerd.sock




9、在master节点拉取K8S所需镜像

#拉取k8s集群所需要的镜像


kubeadm config images pull \

--image-repository registry.aliyuncs.com/google_containers \

--kubernetes-version v1.30.0 \

--cri-socket=unix:///var/run/cri-dockerd.sock




#上传镜像到harbor仓库


docker images | awk '/google/{ print $1":"$2}' \

| awk -F "/" '{system("docker tag "$0" reg.cfy.org/k8s/"$3)}'


docker images | awk '/k8s/{system("docker push "$1":"$2)}'




10、集群初始化

#启动kubelet服务


systemctl status kubelet.service




#执行初始化命令


kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.cfy.org/k8s --kubernetes-version v1.30.0 --cri-socket=unix:///var/run/cri-dockerd.sock

 




#指定集群配置文件变量


echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile


#当前节点没有就绪,因为还没有安装网络插件,容器没有运行


kubectl get node




kubectl get pod -A




生成集群token


kubeadm token create --print-join-command




11、安装flannel网络插件

#下载flannel的yaml部署文件


wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml




#下载镜像:


docker pull docker.io/flannel/flannel:v0.25.5




解压


docker load -i flannel-0.25.5.tag.gz




#上传镜像到仓库


docker tag flannel/flannel:v0.25.5 \

reg.cfy.org/flannel/flannel:v0.25.5


docker push reg.cfy.org/flannel/flannel:v0.25.5




docker tag flannel/flannel-cni-plugin:v1.5.1-flannel1 \

reg.cfy.org/flannel/flannel-cni-plugin:v1.5.1-flannel1


docker push reg.cfy.org/flannel/flannel-cni-plugin:v1.5.1-flannel1




#编辑kube-flannel.yml 修改镜像下载位置


vim kube-flannel.yml








kubectl apply -f kube-flannel.yml




12、节点扩容

PS:每次初始化失败记得重置kubeadm kubeadm reset


在所有的worker节点中


1 确认部署好以下内容


2 禁用swap


3 安装: kubelet-1.30.0 kubeadm-1.30.0 kubectl-1.30.0 docker-ce cri-dockerd


4 修改cri-dockerd启动文件添加 --network-plugin=cni --pod-infra-container-image=reg.timinglee.org/k8s/pause:3.9


5 启动服务 kubelet.service cri-docker.service


以上信息确认完毕后即可加入集群


[root@k8s-node1 & 2 ~]# kubeadm join 172.25.254.100:6443 --token 8v417e.9gbxi2xx30a66hep --discovery-token-ca-cert-hash sha256:0ef4bb7bcf228f005d6b3cd40a3c3a3ecdd416445db488816145e01bc80bb932 --cri-socket=unix:///var/run/cri-dockerd.sock



在master阶段中查看所有node的状态


kubectl get node




所有阶段的STATUS为Ready状态,那么恭喜你,你的kubernetes就装好了!!


测试集群运行情况


建立一个pod


kubectl run test --image nginx  建立一个pod




kubectl get pods  #查看pod状态




kubectl delete pod test  #删除pod


————————————————


                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

                        

原文链接:https://blog.csdn.net/m0_72520945/article/details/142798779