暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Openstack+Kubernetes+Docker+Grafana全链路环境搭建演示

戏水蓝鲸 2021-08-13
1129

疫情的影响,2020年初开始之后的16个月一直处于休息的状态,工作14年,难得休息了这么久,机会属实难得,古人云,读万卷书,行万里路,万卷书读不下,多走走祖国的大好河山还是有可能的事情,于是有了2020年4月份的三亚之旅(大概是第七八次去三亚)、6月的稻城亚丁之行、7月的敦煌之旅、8月14日出发川进青出大环线5000+公里的难忘自驾旅程,9月底的敦煌二次游(拍银河),12月份松花湖滑雪、2021年3月份新疆阿勒泰、禾目吉克普林粉雪之旅.

    玩的同时,没有忘记自己作为互联网技术人的本分,于是在间歇,有了这片文章的原型,今天整理出来,纪念一年前的明天开始的川进青出大环线之旅.碍于篇幅字数的限制,去掉了很多调试输出信息以及问题定位的思路.只留下了比较核心的内容,想获取完整的版本,可以私信联系我(8173960)


#################  Openstack核心组件介绍  ##################

keystone(身份服务模块):认证管理服务、提供了其余所有组件的认证信息/令牌的管理、创建、修改等等

Nova(计算服务组件):计算资源的管理,实例生命周期的管理(虚拟机),对外提供Restful API通信

Glance(镜像服务组件):提供虚拟机镜像的存储,查询和检索功能,为nova进行服务,依赖于存储服务(存储镜像本身)和数据库服务(存储镜像相关的数据)

Swift(对象存储服务模块):提供高可用分布式对象存储服务,特点是无限和扩展没有单点故障。

Cinder(块存储服务模块):管理所有块存储设备,为虚拟机提供存储服务。

Neutorn(网络服务组件):为云计算提供虚拟的网络功能,为每个不同的租户建立独立的网路环境

Ceilometer(监控服务组件):为上层的计费、结算或者监控应用提供统一的资源使用数据收集功能

Horizon(控制台服务):提供了以Web形式对所有节点的所有服务的管理,通常把该服务成为Dashboard

###################  openstack安装配置  ####################

@@ 环境准备,所有节点

@@@ 设置主机名称,不能再次更改

@@@ 关闭selinux

sed -i 's#SELINUX=enforcing#SELINUX=disabled#g'/etc/sysconfig/selinux

setenforce 0

@@@ 关闭iptables

………

@@@ 设置时间同步

@@@@ 控制节点

[root@k8scs ~]# yum install -y chrony

[root@k8scs ~]# vim /etc/chrony.conf

allow 192.168/16 #允许那些服务器和自己同步时间

[root@k8scs ~]# systemctl enable chronyd.service

[root@k8scs ~]# systemctl start chronyd.service

[root@k8scs ~]# timedatectl set-timezone Asia/Shanghai

[root@k8scs ~]# timedatectl status

    ………

@@@@ 计算节点

[root@k9scs ~]# yum install -y chrony

[root@k9scs ~]# vim /etc/chrony.conf

server 192.168.1.100 iburst #只留一行

[root@k9scs ~]# systemctl enable chronyd.service

[root@k9scs ~]# systemctl start chronyd.service

[root@k9scs ~]# timedatectl set-timezone Asia/Shanghai

[root@k9scs ~]# timedatectl status

   ………

@@@ 安装软件包

@@@@ 控制节点,顺序安装

@@@@@ Base

yum install -y epel-release-7-8.noarch.rpm

yum install -y centos-release-openstack-liberty

yum install -y python-openstackclient

@@@@@ MySQL

yum install -y mariadb mariadb-server MySQL-python

@@@@@ RabbitMQ

yum install -y rabbitmq-server

@@@@@ Keystone

yum install -y openstack-keystone httpd mod_wsgimemcached python-memcached

@@@@@ Glance

yum install -y openstack-glance python-glancepython-glanceclient

@@@@@ Nova

yum install -y openstack-nova-api openstack-nova-certopenstack-nova-conductor openstack-nova-console openstack-nova-novncproxyopenstack-nova-scheduler python-novaclient

yum install -y openstack-nova-compute sysfsutils

@@@@@ Neutron linux-node1.example.com

yum install -y openstack-neutron openstack-neutron-ml2openstack-neutron-linuxbridge python-neutronclient ebtables ipset

@@@@@ Dashboard

yum install -y openstack-dashboard

@@@@@ Cinder

yum install -y openstack-cinder python-cinderclient

@@@@ 计算节点

@@@@ Base

yum install -yhttp://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 

yum install -y openstack-nova-compute sysfsutils  

@@@@ Neutron 

yum install -y openstack-neutronopenstack-neutron-linuxbridge ebtables ipset

@@@@ Cinder

yum install -y openstack-cinder python-cinderclienttargetcli python-oslo-policy

    

@@ 配置mysql

@@@ 初始化数据库实例

[root@linux-node1~]# cp /usr/share/mysql/my-medium.cnf/etc/my.cnf   

 ………

[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     

@@@ 创建数据库

[root@openstack-server ~]# mysql -p123456

………

@@ 配置rabbitmq

@@@ 启动rabbitmq, 端口 5672,添加 openstack 用户

[root@linux-node1 ~]# systemctl enablerabbitmq-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 startrabbitmq-server.service

[root@linux-node1 ~]# rabbitmqctl add_user openstackopenstack    

[root@linux-node1 ~]# rabbitmqctl set_permissionsopenstack ".*" ".*" ".*"   

[root@linux-node1 ~]# rabbitmq-plugins list             

.........

[ ] rabbitmq_management 3.6.2       

.........

@@@ 启动插件

[root@linux-node1 ~]# rabbitmq-plugins enablerabbitmq_management #启动插件

The following plugins have been enabled:

………

[root@linux-node1 ~]# systemctl restartrabbitmq-server.service

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

访问RabbitMQ,访问地址是http://58.68.250.17:15672

@@ 启动memcached

启动 memcached

[root@linux-node1 ~]# systemctl enable memcached

[root@linux-node1 ~]# systemctl start memcached

@@ 配置apache

配置 httpd

[root@linux-node1 ~]# vim /etc/httpd/conf/httpd.conf

ServerName 192.168.1.100:80

启动 httpd

[root@linux-node1 config]# systemctl enable httpd

[root@k8scs ~]# netstat -lntup|grep httpd               

………

[root@linux-node1 ~]# cat/etc/httpd/conf.d/wsgi-keystone.conf

文件不存在,通过搜索,发现/usr/share/keystone/wsgi-keystone.conf

[root@linux-node1 ~]# cat/usr/share/keystone/wsgi-keystone.conf

.......

[root@linux-node1 ~]# cp /usr/share/keystone/wsgi-keystone.conf/etc/httpd/conf.d/wsgi-keystone.conf

[root@linux-node1 config]# systemctl start httpd

[root@k8scs ~]# netstat -lntup|grep httpd

 ………

如果 http 起不来关闭 selinux 或者安装 yum install openstack-selinux

@@ 配置keystone

@@@ 修改/etc/keystone/keystone.conf

取一个随机数

[root@linux-node1 ~]# openssl rand -hex 10

dac616efdb3659d28e14

[root@linux-node1 ~]# cat/etc/keystone/keystone.conf|grep -v "^#"|grep -v "^$"

[DEFAULT]

admin_token = dac616efdb3659d28e14               

connection =mysql://keystone:keystone@192.168.1.100/keystone    

@@@ 创建数据库表, 使用命令同步

[root@linux-node1 ~]# su -s /bin/sh -c"keystone-manage db_sync" keystone

………  

[root@linux-node1 ~]# ll /var/log/keystone/keystone.log

……… 

[root@linux-node1 config]# mysql -h 192.168.1.100 -ukeystone -p   

@@@ 创建keystone 项目、角色、用户、服务

@@@@ 临时设置 admin_token 用户的环境变量,用来创建用户

[root@k8scs ~]#export OS_TOKEN=dac616efdb3659d28e14            #上面产生的随机数值

[root@k8scs ~]#export OS_URL=http://192.168.1.100:35357/v3

[root@k8scs ~]#export OS_IDENTITY_API_VERSION=3

@@@@ 创建 admin 项目---创建 admin用户 ---创建 admin 角色---把 admin 用户加入到admin 项目赋予 admin 的角色(三个 admin 的位置:项目,用户,角色)

[root@k8scs ~]# openstack project create --domain default--description "Admin Project" admin

………

[root@k8scs ~]# 

@@@@ 创建admin用户

[root@k8scs ~]# openstack user create --domain default--password-prompt admin

User Password:admin

Repeat User Password:admin

………创建admin角色

[root@k8scs ~]# openstack role create admin

………

[root@k8scs ~]# 

关联用户角色

[root@k8scs ~]#openstack role add --project admin --useradmin admin

@@@@ 创建一个普通用户 demo

建立demo项目

[root@k8scs ~]# openstack project create --domain default--description "Demo Project" demo

………

[root@k8scs ~]# 

建立demo角色

[root@k8scs ~]# openstack user create --domain default--password=demo demo

………

[root@k8scs ~]# 

建立user角色

[root@k8scs ~]# openstack role create user

………

[root@k8scs ~]# 

关联用户角色

[root@k8scs ~]#openstack role add --project demo --userdemo user

@@@@ 创建 service 项目,用来管理其他服务

[root@k8scs ~]# openstack project create --domain default--description "Service Project" service

………

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

@@@@ 查看创建的用户和项目

[root@k8scs ~]# openstack user list

[root@k8scs ~]# 

@@@ 注册keystone 服务,以下三种类型分别为公共的、内部的、管理的

[root@k8scs ~]# openstack service create --name keystone--description "OpenStack Identity" identity

[root@k8scs ~]# 

[root@k8scs ~]# openstack endpoint create --regionRegionOne identity public http://192.168.1.100:5000/v2.0

[root@k8scs ~]# openstack endpoint create --regionRegionOne identity internal http://192.168.1.100:5000/v2.0

[root@k8scs ~]# 

[root@k8scs ~]# openstack endpoint create --regionRegionOne identity admin http://192.168.1.100:35357/v2.0

 

[root@k8scs ~]# openstack endpoint list

openstack endpoint delete ID             #使用这个命令删除

@@@ 验证

获取 token,只有获取到才能说明 keystone 配置成功

[root@k8scs ~]# unset OS_TOKEN

[root@k8scs ~]# unset OS_URL

[root@k8scs ~]# openstack --os-auth-urlhttp://192.168.1.100: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: 

………

[root@k8scs ~]# cat /root/admin-openrc.sh 

………

[root@k8scs ~]# cat /root/demo-openrc.sh 

………

[root@k8scs ~]# 

[root@k8scs ~]# source admin-openrc.sh

[root@k8scs ~]# openstack token issue

[root@k8scs ~]# source demo-openrc.sh 

[root@k8scs ~]# openstack token issue

[root@k8scs ~]# 

@@ 配置glance 镜像服务

Glance由三部分构成:glance-api、glance-registry、image store

glance-api接受系统镜像的创建、删除、读取请求

glance-registry云系统的镜像注册服务

端口:

api       9191

registry   9292

@@@ 修改配置文件,/etc/glance/glance-api.conf

[root@k8scs glance]# cat /etc/glance/glance-api.conf|grep-v "^#"|grep -v "^$"

………

@@@ 创建数据库表,同步数据库

[root@k8scs glance]# su -s /bin/sh -c "glance-managedb_sync" glance

No handlers could be found for logger"oslo_config.cfg"

[root@k8scs glance]# mysql -h192.168.1.100 -uglance -p

@@@ 创建关于 glance 的 keystone 用户

[root@k8scs ~]# source admin-openrc.sh 

[root@k8scs ~]# openstack user create --domain default--password=glance glance

………

[root@k8scs ~]# openstack role add --project service--user glance admin

[root@k8scs ~]# 

@@@ 启动glance

[root@k8scs ~]# systemctl enable openstack-glance-api

Created symlink from /etc/systemd/system/multi-user.target.wants/openstack-glance-api.serviceto /usr/lib/systemd/system/openstack-glance-api.service.

[root@k8scs ~]# systemctl enableopenstack-glance-registry

Created symlink from/etc/systemd/system/multi-user.target.wants/openstack-glance-registry.serviceto /usr/lib/systemd/system/openstack-glance-registry.service.

[root@k8scs ~]# systemctl start openstack-glance-api

[root@k8scs ~]# systemctl start openstack-glance-registry

[root@k8scs ~]# netstat -lnutp |grep 9191 #registry

………    

[root@k8scs ~]# netstat -lnutp |grep 9292 #api

………   

[root@k8scs ~]# 

@@@ 在 keystone上注册

[root@k8scs ~]# source admin-openrc.sh

[root@k8scs ~]# openstack service create --name glance--description "OpenStack Image service"

[root@k8scs ~]# openstack endpoint create --regionRegionOne image public http://192.168.1.100:9292

[root@k8scs ~]# openstack endpoint create --regionRegionOne image internal http://192.168.1.100:9292

[root@k8scs ~]# openstack endpoint create --regionRegionOne image admin http://192.168.1.100:9292   

[root@k8scs ~]# 

@@@ 添加glance 环境变量并测试

[root@k8scs ~]# echo "exportOS_IMAGE_API_VERSION=2" | tee -a admin-openrc.sh demo-openrc.sh

export OS_IMAGE_API_VERSION=2

[root@k8scs ~]# glance image-list

[root@k8scs ~]# 

@@ 下载centos镜像并上传到 glance

@@@ cirros-0.3.4-x86_64-disk.img镜像

cirros-0.3.4-x86_64-disk.img 是openstack虚拟机镜像,最小化安装linux系统所需镜像文件

@@@@ 下载

[root@k8scs ~]# wget -qhttp://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img    

@@@@ 上传

[root@k8scs ~]# glance image-create --name"cirros" --file cirros-0.3.4-x86_64-disk.img --disk-format qcow2--container-format bare --visibility public --progress

[root@k8scs ~]# 

@@@ CentOS-7-x86_64-GenericCloud.qcow2,centos的云镜像

@@@@ 下载

[root@k8scs ~]# wgethttp://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2

@@@@ 上传

[root@k8scs ~]# glance image-create --name"CentOS-7-x86_64" --file CentOS-7-x86_64-GenericCloud.qcow2--disk-format qcow2 --container-format bare --visibility public --progress

[=============================>] 100%

[root@k8scs ~]# 

@@@ 查看镜像

[root@k8scs ~]# glance image-list

[root@k8scs ~]# 

[root@k8scs ~]#  ll/var/lib/glance/images/

total 851636

-rw-r----- 1 glance glance 858783744 Nov 21 22:036c6da4e6-7327-4657-be5f-4753dbe17ed9

-rw-r----- 1 glance glance  13287936 Nov 21 21:56a0c1c614-67e1-41d8-940c-0e5fcb9e3d6c

[root@k8scs ~]# 

@@ 配置nova 服务

@@@ 同步数据库

[root@k8scs ~]# su -s /bin/sh -c "nova-manage dbsync" nova

No handlers could be found for logger"oslo_config.cfg"

[root@k8scs ~]# mysql -h192.168.1.100 -unova -p

@@@ 创建nova 的 keystone 用户

[root@k8scs ~]# openstack user create --domain default--password=nova nova

[root@k8scs ~]# openstack role add --project service--user nova admin

[root@k8scs ~]# 

@@@ Nova控制节点配置

@@@@ 修改/etc/nova/nova.conf

[root@k8scs ~]# cat /etc/nova/nova.conf|grep -v"^#"|grep -v "^$"

………

@@@@ 启动 nova 相关服务

[root@k8scs ~]# systemctl enableopenstack-nova-api.service openstack-nova-cert.serviceopenstack-nova-consoleauth.service openstack-nova-scheduler.serviceopenstack-nova-conductor.service openstack-nova-novncproxy.service

………

[root@k8scs ~]# 

控制节点也作为计算节点的话,需要启动下面服务

root@k8scs ~]#systemctl start libvirtdopenstack-nova-compute

@@@@ 在 keystone 上注册

[root@k8scs ~]# openstack service create --name nova--description "OpenStack Compute" compute

[root@k8scs ~]# openstack endpoint create --regionRegionOne compute public http://192.168.1.100:8774/v2/%\(tenant_id\)s

[root@k8scs ~]# openstack endpoint create --regionRegionOne compute internal http://192.168.1.100:8774/v2/%\(tenant_id\)s

[root@k8scs ~]# openstack endpoint create --regionRegionOne compute admin http://192.168.1.100:8774/v2/%\(tenant_id\)s 

[root@k8scs ~]# 

[root@k8scs ~]# openstack host list

[root@k8scs ~]# 

@@@ nova 计算节点配置

@@@@ 同步文件

[root@k8scs home]# scp /etc/nova/nova.conf192.168.1.101:/etc/nova  

   

@@@@ 修改文件

[root@k9scs home]# vim /etc/nova/nova.conf

my_ip=192.168.1.101

novncproxy_base_url=http://192.168.1.100:6080/vnc_auto.html

vncserver_listen=0.0.0.0

vncserver_proxyclient_address= $my_ip

keymap=en-us

[glance]

host=192.168.56.100

[libvirt]

virt_type=kvm  

@@@@ 启动服务

[root@k9scs nova]# systemctl start libvirtdopenstack-nova-compute   

@@@ 验证,在控制节点

[root@k8scs ~]# openstack host list

[root@k8scs ~]# 

@@ Neutron 网络服务

@@@ openstack 网络分类:

公共网络 向租户提供访问或者API调用

管理网络 云中物理机之间的通信

存储网络 云中存储的网格,如ISCSI或GlusterFS使用

服务网格 虚拟机内部使用的网络

@@@ Neutron 控制节点配置( 5 个配置文件)

@@@@ 修改/etc/neutron/neutron.conf 文件

[root@k8scs ~]# 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.100:8774/v2

rpc_backend=rabbit

[matchmaker_redis]

[matchmaker_ring]

[quotas]

[agent]

[keystone_authtoken]

auth_uri = http://192.168.1.100:35357/v2.0/

identity_uri = http://192.168.1.100:5000

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.100: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.100

rabbit_port = 5672

rabbit_userid = openstack

rabbit_password = openstack

[qos]

[root@k8scs ~]# 

@@@@ 配置/etc/neutron/plugins/ml2/ml2_conf.ini

[root@k8scs ~]# 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

[root@k8scs ~]# 

@@@@ 配置/etc/neutron/plugins/ml2/linuxbridge_agent.ini

[root@k8scs ~]# cat /etc/neutron/plugins/ml2/linuxbridge_agent.ini|grep-v "^#"|grep -v "^$"

[linux_bridge]

physical_interface_mappings = physnet1:enp2s0f0  #改成本机的网卡名称

[vxlan]

enable_vxlan = false

[agent]

prevent_arp_spoofing = True

[securitygroup]

firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

enable_security_group = True

[root@k8scs ~]# 

@@@@ 修改/etc/neutron/dhcp_agent.ini

[root@k8scs ~]# 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]

@@@@ 修改/etc/neutron/metadata_agent.ini

[root@k8scs neutron]# cat/etc/neutron/metadata_agent.ini|grep -v "^#"|grep -v "^$"

[DEFAULT]

auth_uri = http://192.168.1.100:5000

auth_url = http://192.168.1.100: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.100

metadata_proxy_shared_secret = neutron

admin_tenant_name = %SERVICE_TENANT_NAME%

admin_user = %SERVICE_USER%

admin_password = %SERVICE_PASSWORD%

[AGENT]

[root@k8scs neutron]# 

@@@@ 创建连接并创建 keystone 的用户

[root@k8scs ~]#  ln -s/etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

[root@k8scs ~]# openstack user create --domain default--password=neutron neutron

………

[root@k8scs ~]# openstack role add --project service--user neutron admin

[root@k8scs ~]# 

@@@@ 更新数据库

[root@k8scs ~]# 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

  OK

[root@k8scs ~]# 

@@@@ 注册 keystone

[root@k8scs ~]# source admin-openrc.sh

[root@k8scs ~]# openstack service create --name neutron--description "OpenStack Networking"

[root@k8scs ~]# openstack endpoint create --regionRegionOne network public http://192.168.1.100:9696

[root@k8scs ~]# openstack endpoint create --regionRegionOne network internal http://192.168.1.100:9696

[root@k8scs ~]# openstack endpoint create --regionRegionOne network admin http://192.168.1.100:9696   

[root@k8scs ~]# 

@@@@ 启动服务并检查

因为neutron和nova有联系,做neutron时修改nova的配置文件,上面nova.conf已经做了neutron的关联配置,所以要重启openstack-nova-api服务。

这里将nova的关联服务都一并重启

[root@k8scs ~]# systemctl restartopenstack-nova-api.service openstack-nova-cert.serviceopenstack-nova-consoleauth.service openstack-nova-scheduler.serviceopenstack-nova-conductor.service openstack-nova-novncproxy.service

@@@@ 启动neutron相关服务

[root@k8scs ~]# systemctl enable neutron-server.serviceneutron-linuxbridge-agent.service neutron-dhcp-agent.serviceneutron-metadata-agent.service

[root@k8scs ~]# systemctl start neutron-server.serviceneutron-linuxbridge-agent.service neutron-dhcp-agent.service neutron-metadata-agent.service

PolicyKit daemon disconnected from the bus.

We are no longer a registered authentication agent.

[root@k8scs ~]# 

@@@@ 检查

[root@k8scs ~]# neutron agent-list

[root@k8scs ~]# 

[root@k8scs ~]# openstack endpoint list

[root@k8scs ~]# 

@@@ Neutron 计算节点配置

@@@@ 修改相关配置文件

从指控节点上直接拷贝

[root@k8scs ~]# scp /etc/neutron/neutron.conf192.168.1.101:/etc/neutron/

[root@k8scs ~]# scp /etc/neutron/plugins/ml2/linuxbridge_agent.ini192.168.1.101:/etc/neutron/plugins/ml2/

[root@k8scs ~]# scp /etc/neutron/plugins/ml2/ml2_conf.ini192.168.1.8:/etc/neutron/plugins/ml2/

@@@@ 创建软连接并启动服务

[root@k9scs ~]# ln -s/etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

[root@k9scs ~]# systemctl enableneutron-linuxbridge-agent.service

[root@k9scs ~]# systemctl startneutron-linuxbridge-agent.service

@@@@ 检查

[root@k8scs ml2]# neutron agent-list

[root@k8scs ml2]# 

@@ 创建虚拟机

@@@ 创建桥接网络

@@@@ 创建网络

[root@k8scs ~]# source admin-openrc.sh 

[root@k8scs ~]# neutron net-create flat --shared --provider:physical_networkphysnet1 --provider:network_type flat

Created a new network:

[root@k8scs ~]# 

@@@@ 创建子网(填写宿主机的内网网关,下面DNS和内网网关可以设置成宿主机的内网ip,下面192.168.1.150-200是分配给虚拟机的ip范围)

[root@k8scs ~]# neutron subnet-create flat 192.168.1.0/24--name flat-subnet --allocation-pool start=192.168.1.150,end=192.168.1.200--dns-nameserver 192.168.1.100 --gateway 192.168.1.100

Created a new subnet:

[root@k8scs ~]# 

@@@@ 查看子网

[root@k8scs ~]# neutron net-list

@@@ 创建虚拟机(为vm分配内网ip,后续利用squid代理或宿主机NAT端口转发进行对外或对内访问)

@@@@创建key

[root@k8scs ~]# source demo-openrc.sh  #这是在demo账号下创建虚拟机;要是在admin账号下创建虚拟机,就用source admin-openrc.sh)

[root@k8scs ~]# ssh-keygen -q -N ""

Enter file in which to save the key (/root/.ssh/id_rsa): 

[root@k8scs ~]# 

@@@@ 将公钥添加到虚拟机

[root@k8scs ~]#  novakeypair-add --pub-key /root/.ssh/id_rsa.pub mykey

[root@k8scs ~]#  novakeypair-list

[root@k8scs ~]# 

@@@@ 创建安全组

[root@k8scs ~]# nova secgroup-add-rule default icmp -1 -10.0.0.0/0

[root@k8scs ~]# 

@@@@ 创建虚拟机

查看支持的虚拟机类型

[root@k8scs ~]# nova flavor-list

[root@k8scs ~]# 

@@@@ 查看镜像

[root@k8scs ~]# nova image-list

[root@k8scs ~]# 

@@@@ 查看网络

[root@k8scs ~]# nova image-list

[root@k8scs ~]# neutron net-list

[root@k8scs ~]# 

@@@@ 创建虚拟机 【这一步容易报错,一般都是由于上面的 nova.conf 配置填写有误所致】

[root@k8scs ~]# nova boot --flavor m1.medium --imagecirros --nic net-id=93939b8f-06e1-4ff5-8098-f05aa0e20042 --security-groupdefault --key-name mykey k8scs01                 

@@@@@ 虚拟机创建失败

[root@k8scs nova]# nova list

查看虚拟机创建过程的完整日志

 tail -f /var/log/nova/nova-compute.log  

发现如下错误信息

Timeout waiting for vif plugging callback for instancea83113da-350f-42a9-bfdd-159e58c0b298

参考这篇文章

https://ask.openstack.org/en/question/50283/failed-to-notify-nova-on-events-specified-rpc-version-cap-30-is-too-low-needs-to-be-higher-than-323/

解决方案

修改/etc/nova/nova.conf

修改如下参数

vif_plugging_is_fatal = False

vif_plugging_timeout = 2

nova关于磁盘分区的定义

同上的日志文件有如下内容出现

2020-11-22 22:13:48.058 11514 INFOnova.compute.resource_tracker [req-cc22657a-ba7e-45db-ac85-b9d71db42415 - - - --] Final resource view: name=k8scs phys_ram=32365MB used_ram=4608MBphys_disk=49GB used_disk=40GB total_vcpus=28 used_vcpus=2 pci_stats=None

phys_disk=49GB

nova将一个小分区当作了默认磁盘分区,更改参数

/etc/nova/nova.conf

修改state_path=/home/nova/vmdir  指定一个大分区

找个目录下必须建好instance目录,否则报错

@@@@@ 查看虚拟机

[root@k8scs nova]# nova list

如果要删除虚拟机(利用虚拟机ID进行删除)

nova delete e2f4c6d5-b0ca-43cc-8f3e-9476acae1f73

ssh cirros@192.168.1.157   cirros镜像做出来的系统默认用户是cirros

ssh centos@192.168.1.156   CentOS-7-x86_64镜像做出来的系统默认用户是centos

@@@@@ web 界面打开虚拟机

[root@k8scs nova]# nova get-vnc-console k8scs01 novnc

[root@k8scs nova]# 

@@ 安装dashboard,登陆 web 管理界面

@@@ 安装软件

[root@k8scs ~]# yum install openstack-dashboard -y

[root@k8scs ~]# 

@@@ 编辑配置文件

[root@k8scs ~]# vim/etc/openstack-dashboard/local_settings         #按照下面几行进行配置修改

OPENSTACK_HOST = "192.168.1.100"                  #更改为keystone机器地址

OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"        #默认的角色

ALLOWED_HOSTS = ['*']                      #允许所有主机访问

CACHES = {

'default': {

'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',

'LOCATION': '192.168.1.100:11211',                   #连接memcached

}

}

#CACHES = {

# 'default': {

# 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',

# }

#}

TIME_ZONE = "Asia/Shanghai"             #设置时区

@@@ 重启httpd 服务

[root@k8scs ~]# systemctl restart httpd

@@@ web 界面登录访问dashboard

http://192.168.1.100/dashboard/

至此,openstack环境搭建完毕.

 

#######################Kubernetes特性 #######################

 

    自我修复:        在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。

    弹性伸缩:        使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。

    自动部署和回滚:   K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务。

    服务发现和负载均衡: K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。

    机密和配置管理:   管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。

    存储编排:        挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。

    批处理:                  提供一次性任务,定时任务;满足批量数据处理和分析的场景。

   

 

#########################组件及概念#########################

 

    @@ Master组件

        kube-apiserver:           集群的统一入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。

        kube-controller-manager:  所有资源的自动化控制中心,处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。

        kube-scheduler:           负责资源调度,根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上

        etcd:                     保存集群网络配置和资源状态信息,分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息。用于资源共享和服务发现

 

    @@ node组件

        kubelet:            kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。

        kube-proxy:         实现service通信与负载均衡,在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。

        docker或rocket:     容器引擎,运行容器

 

 

    @@ Pod

        最小部署单元

        一组容器的集合

        一个Pod中的容器共享网络命名空间

        Pod是短暂的

   

    @@ Controllers

        ReplicaSet :确保预期的Pod副本数量

        Deployment :无状态应用部署

        StatefulSet :有状态应用部署

        DaemonSet :确保所有Node运行同一个Pod

        Job :一次性任务

        Cronjob :定时任务

        ConfigMap对像是一系列配置的集合,k8s会将这一集合注入到对应的Pod对像中,并为容器启动使用

       

    @@ Service

        防止Pod失联

        定义一组Pod的访问策略

    @@ Label :标签,附加到某个资源上,用于关联对象、查询和筛选

    @@ Namespaces:命名空间,将对象逻辑上隔离

    @@ Annotations :注释

    @@ CNI(container networkinterface)是容器网络接口,它是一种标准设计和库,为了让用户在容器创建或者销毁时都能够更容易的配置容器网络。

        目前比较流行的CNI插件:Flannel、Calico、Weave、Canal

 

 

#####################使用kubeadm快速安装kubernetes集群 #####################

 

    @@ 安装kubeadm环境 @@

 

        @@@ 主机规划

        IP            角色           安装软件

        192.168.1.160Master   kube-apiserverkube-schduler kube-controller-manager docker flannel kubelet

        192.168.1.161node  kubelet kube-proxy docker flannel

        192.168.1.162node  kubelet kube-proxy docker flannel

        192.168.1.163node  kubelet kube-proxy docker flannel

        192.168.1.164node     kubelet kube-proxydocker flannel

        192.168.1.165node     kubelet kube-proxydocker flannel

 

        @@@ 环境初始化 @@@

 

             在所有主机上均执行下面命令

            

             @@@@ 关闭防火墙及selinux

                 [root@k8scs001 ~]# systemctlstop firewalld && systemctl disable firewalld

                 [root@k8scs001 ~]# sed -i's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config  && setenforce 0

            

             @@@@ 关闭 swap 分区

                 [root@k8scs001 ~]# swapoff -a #临时

                 [root@k8scs001 ~]#  sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab#永久

            

             @@@@ 添加主机名

                 ………

           

            @@@@内核调整,将桥接的IPv4流量传递到iptables的链

                 [root@k8scs001 ~]# cat >/etc/sysctl.d/k8s.conf << EOF

                 net.bridge.bridge-nf-call-ip6tables= 1

                 net.bridge.bridge-nf-call-iptables= 1

                 EOF

            

                 [root@k8scs001 ~]# sysctl--system

            

             @@@@ 设置系统时区并同步时间服务器

                 [root@k8scs001 ~]# yum install-y ntpdate

                 [root@k8scs001 ~]# ntpdatetime.windows.com

 

             @@@@ 安装docker

                 wgethttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O/etc/yum.repos.d/docker-ce.repo

                 yum install -ydocker-ce-19.03.13-3.el

                 启动

                 systemctl enable docker&& system start docker

 

             @@@@ 添加kubernetes YUM软件源

                

                 cat <<EOF >/etc/yum.repos.d/kubernetes.repo

                 [kubernetes]

                 name=Kubernetes

                 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/

                 enabled=1

                 gpgcheck=1

                 repo_gpgcheck=1

                 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpghttps://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

                 EOF

 

             @@@@ 安装kubeadm,kubelet和kubectl ,所有主机上都要安装

                 yum install -y kubelet kubeadmkubectl

                 systemctl enable kubelet

 

 

    @@ 建立集群 @@

   

        @@@ 部署Kubernetes Master

       

             只需要在Master 节点执行,这里的apiserve需要修改成自己的master地址

            

             kubeadm init \

             --apiserver-advertise-address=192.168.1.160\

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

             --kubernetes-version v1.19.0 \

             --service-cidr=10.1.0.0/16 \

             --pod-network-cidr=10.244.0.0/16

            

             根据输出提示操作

             To start using your cluster, youneed 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

              

              

             @@@@ 默认token的有效期为24小时,当过期之后,该token就不可用了,如果后续有nodes节点加入,解决方法如下:

                 重新生成新的token

                 kubeadm token create

                 [root@k8scs001 ~]# kubeadmtoken create

                 0w3a92.ijgba9ia0e3scicg

                 [root@k8scs001 ~]# kubeadmtoken list

                 TOKEN                     TTL       EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS

                 0w3a92.ijgba9ia0e3scicg   23h      2019-09-08T22:02:40+08:00  authentication,signing  <none>                                                    system:bootstrappers:kubeadm:default-node-token

                 t0ehj8.k4ef3gq0icr3etl0   22h      2019-09-08T20:58:34+08:00  authentication,signing   Thedefault bootstrap token generated by 'kubeadm init'.  system:bootstrappers:kubeadm:default-node-token

                 [root@k8scs001 ~]#

                

                 获取ca证书sha256编码hash值

                

                 [root@k8scs001 ~]# openssl x509-pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

                 ce07a7f5b259961884c55e3ff8784b1eda6f8b5931e6fa2ab0b30b6a4234c09a

                    

             @@@@ 节点加入集群

                 [root@k8scs001 ~]# kubeadm join--token aa78f6.8b4cafc8ed26c34f --discovery-token-ca-cert-hashsha256:0fd95a9bc67a7bf0ef42da968a0d55d92e52898ec37c971bd77ee501d845b538192.168.1.160:6443 --skip-preflight-chec

       

   

             @@@@ 加入Kubernetes Node

                

                 使用kubeadm join 注册Node节点到Matser,kubeadm join 的内容,在上面kubeadm init 已经生成好了

                

                 kubeadm join 192.168.1.160:6443--token 6kn16r.74r2mqv180fjonz3    --discovery-token-ca-cert-hashsha256:07e7fde859dff26bc1e03d63aba9e850a904fb17ecbe9eb940aa163875f00d4d

                

                 [root@k8scs001 ~]# kubectl getnodes

              

           

        @@@ 查看组件状态

             [root@k8scs001 ~]# kubectl getcomponentstatus

             Warning: v1 ComponentStatus isdeprecated in v1.19+

             NAME                 STATUS      MESSAGE                                                                                       ERROR

             scheduler            Unhealthy   Get"http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect:connection refused  

             controller-manager   Unhealthy  Get "http://127.0.0.1:10252/healthz": dial tcp127.0.0.1:10252: connect: connection refused  

             etcd-0               Healthy     {"health":"true"}        

            

             出现这种情况,是/etc/kubernetes/manifests下/kube-controller-manager.yaml和kube-scheduler.yaml设置的默认端口是0,在文件中注释掉就可以了 

             每个node都需要重启kubelet

             systemctl restart kubelet.service

                                                                              

             [root@k8scs001 manifests]# kubectlget componentstatus

             Warning: v1 ComponentStatus isdeprecated in v1.19+

             NAME                 STATUS    MESSAGE             ERROR

             scheduler            Healthy   ok                 

             controller-manager   Healthy  ok                 

             etcd-0               Healthy   {"health":"true"}  

             [root@k8scs001 manifests]#

                        

        @@@ 安装网络插件,只在master上执行

             [root@k8scs001 ~]# wgethttps://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

            

             [root@k8scs001 ~]# kubectl apply -f/etc/k8s/k8s-cluster-install-yaml/kube-flannel.yml 

            

             [root@k8scs001 ~]# ps -ef|grepflannel

             ………          

            [root@k8scs001~]# kubectl get nodes

            

             查看集群的node状态,安装完网络工具之后,只有显示如下状态,所有节点全部都Ready好了之后才能继续后面的操作

            

             [root@k8scs001 ~]# kubectl get pod-n kube-system

             NAME                               READY   STATUS   RESTARTS   AGE

             ………

           

             只有全部都为1/1则可以成功执行后续步骤,如果flannel需检查网络情况,重新进行如下操作

             kubectl delete -f kube-flannel.yml

             然后重新wget,然后修改镜像地址,然后

             kubectl apply -f kube-flannel.yml

 

 

    @@ 测试Kubernetes集群 @@

 

        [root@k8scs001 ~]# kubectl createdeployment nginx --image=nginx

        deployment.apps/nginx created

        [root@k8scs001 ~]# kubectl exposedeployment nginx --port=80 --type=NodePort

        service/nginx exposed

        [root@k8scs001 ~]# kubectl get pods,svc

        NAME                         READY   STATUS              RESTARTS   AGE

        pod/nginx-6799fc88d8-s4vlp   0/1    ContainerCreating   0          22s

       

        NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE

        service/kubernetes   ClusterIP  10.1.0.1      <none>        443/TCP        98m

        service/nginx        NodePort    10.1.86.255   <none>        80:31638/TCP   9s

        [root@k8scs001 ~]#

       

        访问地址:http://192.168.1.160:80

 

################################部署Dashboard ##############################

 

    @@ 部署 Dashboard @@

 

        @@@ k8s版本:v1.19.0

             [root@k8scs001 ~]# kubectl version

       

        @@@ docker版本:19.03.13

             [root@k8scs001 ~]# docker --version

             Docker version 19.03.13, build4484c46d9d

       

        @@@ github写明v1.19版本需要如下两个镜像

             KubernetesDashboard:kubernetesui/dashboard:v2.0.5

             Metrics Scraper:kubernetesui/metrics-scraper:v1.0.6

       

        @@@ 下载kubernetes-dashboard.yaml文件

             如果链接不上,就在浏览器中输入网址,可以直接打开

             [root@k8scs001 ~]# wgethttps://raw.githubusercontent.com/kubernetes/dashboard/v2.0.5/aio/deploy/recommended.yaml

 

        @@@ 修改文件

             [root@k8scs001 ~] vim kubernetes-dashboard.yaml

             修改内容:

            

             157 spec:

             158   type: NodePort     # 增加此行

             159   ports:

             160     - port: 443

             161       targetPort: 8443

             162       nodePort: 30001   # 增加此行

             163   selector:

             164     k8s-app: kubernetes-dashboard

       

        @@@ 启动dashboard

       

             [root@k8s-master ~]# kubectl create-f /etc/k8s/k8s-cluster-install-yaml/k8s-dashboard.yaml.v2.0.5

   

             [root@k8scs001 ~]# kubectl get pods-A -o wide

             ...

             kube-system   kubernetes-dashboard-6ff6454fdc-67dzz   1/1   Running   1     5h43m  10.244.5.7    k8scs005   <none>     <none>

             ...

             可以看到dashboard跑在k8scs005这个节点上

   

   

             [root@k8scs001 ~]# kubectl createserviceaccount dashboard-admin -n kube-system

             serviceaccount/dashboard-admincreated

            

             [root@k8scs001 ~]# kubectl createclusterrolebinding dashboard-admin --clusterrole=cluster-admin--serviceaccount=kube-system:dashboard-admin

             clusterrolebinding.rbac.authorization.k8s.io/dashboard-admincreated

             [root@k8scs001 ~]#

            

             [root@k8scs001 ~]# kubectl describesecrets -n kube-system $(kubectl -n kube-system get secret | awk'/dashboard-admin/{print $1}')

             ………               

            经过验证,每个节点上都启动了dashboard服务,使用每个节点ip都可以登陆dashboard,在火狐浏览器访问(google受信任问题不能访问)地址:https://NodeIP:30001

             使用令牌方式登陆,使用上面生成的token

 

 

########################建立nginx集群 ######################

   

    @@ 部署deploy @@

   

        [root@k8scs001 ~]# cat/etc/k8s/k8s-cluster-install-yaml/dp-ngixn.yaml

        apiVersion: apps/v1

        kind: Deployment

        metadata:

         creationTimestamp: null

         namespace: nginx

         name: nginx-deploy

         labels:

           app: web1

         name: web1

        spec:

         replicas: 8

         selector:

           matchLabels:

             app: web1

         strategy: {}

         template:

           metadata:

             creationTimestamp: null

             labels:

               app: web1

           spec:

             containers:

             - image: nginx:1.13.2

               imagePullPolicy: IfNotPresent

               name: nginx

               env:

               - name: TZ

                 value: Asia/Shanghai

               ports:

               - containerPort: 80

               resources: {}

        status: {}

        [root@k8scs001 ~]# kubectl apply -f/etc/k8s/k8s-cluster-install-yaml/dp-ngixn.yaml

   

    @@ 查看资源状态 @@

   

        [root@k8scs001 ~]# kubectl get deploy -nnginx -o wide

        NAME  READY   UP-TO-DATE   AVAILABLE  AGE   CONTAINERS   IMAGES         SELECTOR

        ………

        [root@k8scs001 ~]# kubectl get rs -owide -n nginx   

        ………      

        [root@k8scs001~]# kubectl get pod -o wide -n nginx  

        NAME                   READY   STATUS   RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES

        web1-8bd7bb544-5cdlc   1/1    Running   0          16m  10.244.3.9    k8scs004   <none>           <none>

        web1-8bd7bb544-9rnfv   1/1    Running   0          16m  10.244.1.14   k8scs002   <none>           <none>

        web1-8bd7bb544-xcjgl   1/1    Running   0          16m  10.244.5.17   k8scs005   <none>           <none>

       

        [root@k8scs001 ~]# kubectl delete -nnginx pod web1-8bd7bb544-5cdlc

        pod "web1-8bd7bb544-5cdlc"deleted

        [root@k8scs001 ~]# kubectl get pod -owide -n nginx               

        NAME                   READY   STATUS   RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES

        web1-8bd7bb544-9rnfv   1/1    Running   0          16m  10.244.1.14   k8scs002   <none>           <none>

        web1-8bd7bb544-t2qbl   1/1    Running   0          13s  10.244.3.10   k8scs004   <none>           <none>

        web1-8bd7bb544-xcjgl   1/1    Running   0          16m  10.244.5.17   k8scs005   <none>           <none>

       

        删除rs,rs会被重建,rs_id不变,rs管理的所有pod也会重建,pod_id会变

        [root@k8scs001 ~]# kubectl delete -nnginx replicaset web1-8bd7bb544

        replicaset.apps"web1-8bd7bb544" deleted

       

        [root@k8scs001 ~]# kubectl get rs -owide -n nginx                 

       

        [root@k8scs001 ~]# kubectl get pod -owide -n nginx

        ………

 

    @@ 创建service @@

   

        cat/etc/k8s/k8s-cluster-install-yaml/nginx-service-nodeport.yaml

        [root@k8scs001 ~]# catnginx-service-nodeport.yaml

        apiVersion: v1

        kind: Service

        metadata:

         namespace: nginx

         name: nginx-service-nodeport

        spec:

         ports:

           - port: 8000

             targetPort: 80

             protocol: TCP

         type: NodePort

         selector:

           app: web1

        [root@k8scs001 ~]# kubectl create -f/etc/k8s/k8s-cluster-install-yaml/nginx-service-nodeport.yaml

 

        [root@k8scs001 ~]# kubectl get service-n nginx

        NAME                     TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE

        nginx-service-nodeport   NodePort  10.1.235.173   <none>        8000:32692/TCP   10d

        [root@k8scs001 ~]#

       

        32692端口就是集群访问的端口号

 

 

#########################集群升级与回滚#########################

 

    @@ 建立集群 @@

        [root@k8scs001 ~]# kubectl create -fdp-ngixn.yaml --record=true -n nginx  @@@--record参数可以通过kubectl rollout history查看这个dp部署的历史记录和命令

        deployment.apps/web1 created

       

        [root@k8scs001 ~]# kubectl get deploy -nnginx

        NAME  READY   UP-TO-DATE   AVAILABLE  AGE

        web1  8/8     8           8           3m1s

       

        [root@k8scs001 ~]# kubectl get rs -nnginx

        NAME              DESIRED   CURRENT  READY   AGE

        web1-84ffb748cc   8        8         8       5m55s

       

        [root@k8scs001 ~]# kubectl get pods -nnginx 

        NAME                    READY  STATUS    RESTARTS   AGE

        …………………………………………………………

       

        [root@k8scs001 ~]# kubectl rollouthistory deployment/web1 -n nginx

        deployment.apps/web1

        REVISION CHANGE-CAUSE

        1        kubectl create --filename=dp-ngixn.yaml --record=true --namespace=nginx

 

    @@ 升级dp的两种方法 @@

        1.kubectl set image deployment/dp_namepod_name:container_image,设置新的镜像,将触发升级

        2.kubectl edit deployment/dp_name ,进入vi编辑状态,修改保存退出后,将触发升级

 

        查看dp升级过程

        kubectl rollout statusdeployment/dp_name

       

        查看dp详细升级过程

        kubectl describe deployment/dp_name

       

       

        更改yaml文件,触发升级

        [root@k8scs001 ~]# kubectl set imagedeployment/web1 nginx=nginx:1.13.2.1 -n nginx

        deployment.apps/web1 image updated

 

    @@ 查看历史版本 @@

        [root@k8scs001 ~]# kubectl rollouthistory deployment/web1 -n nginx

        deployment.apps/web1

        REVISION CHANGE-CAUSE

        1        kubectl create --filename=dp-ngixn.yaml --record=true --namespace=nginx

        2        kubectl create --filename=dp-ngixn.yaml --record=true --namespace=nginx

 

 

    @@ 查看升级日志 @@

        [root@k8scs001 ~]# kubectl rolloutstatus deployment/web1 -n nginx

        ………

    @@ 回滚 @@

        [root@k8scs001 ~]# kubectl rollout undodeployment/web1 -n nginx

        deployment.apps/web1 rolled back

 

        镜像本身有问题,换一个镜像进行升级

        [root@k8scs001 ~]# kubectl set imagedeployment/web1 nginx=nginx:latest -n nginx       

        deployment.apps/web1 image updated

        [root@k8scs001 ~]#

       

        [root@k8scs001 ~]# kubectl rollout statusdeployment/web1 -n nginx

        …………

        deployment "web1" successfullyrolled out

        [root@k8scs001~]#

       

        [root@k8scs001 ~]# kubectl get pods -nnginx

        ………

       

       

######################集群排障思路###################### 

 

    @@ k8s组件是通过systemctl来管理的,因此可以在/etc/systemd/system或/usr/lib/systemd/system下查找相关配置文件

 

    @@ 主、从节点运行的服务

        [root@k8scs001 prometheus]#  systemctl list-unit-files|grep kube

        kubelet.service                               enabled

        [root@k8scs001 prometheus]#

 

    @@ 正常情况下主节点监听的端口及其程序

   

        @@@ kubelet

             [root@k8scs001 prometheus]# netstat-ntlp|grep kubelet

             …………    

        @@@ kube-proxy

             [root@k8scs001 prometheus]# netstat-ntlp|grep kube-proxy            

             …………

        @@@ kube-scheduler             

            [root@k8scs001prometheus]# netstat -ntlp|grep kube-scheduler

             …………    

        @@@kube-controlle

             [root@k8scs001 prometheus]# netstat-ntlp|grep kube-controlle

             …………    

        @@@kube-apiserver

             [root@k8scs001 prometheus]# netstat-ntlp|grep kube-apiserver

             …………

        @@@ etcd

             [root@k8scs001 prometheus]# netstat-ntlp|grep etcd

             …………    

    @@ 从节点监听的端口及其程序

   

        @@@ kubelet

             [root@k8scs002 ~]#  netstat -ntlp|grep kubelet

             …………        

        @@@kube-proxy  

             [root@k8scs002 ~]#  netstat -ntlp|grep kube-proxy    

             …………  

       

    @@ 查看kubelet服务状态,里面记录启动文件位置

   

        [root@k8scs002 ~]# systemctl statuskubelet.service

        …………

    @@ 查看启动文件内容

   

        [root@k8scs002 ~]# cat/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf

        …………             

    @@ 查看kubelet服务的日志

   

        [root@k8scs002 ~]# journalctl -xefukubelet |more  

        …………

 

###############################相关概念 ##############################

 

    @@ 时序数据库 @@

        简单来说就是存储随时间变化的数据的数据库。什么是随时间变化的数据呢?举个简单的例子,比如,CPU使用率,典型的随时间变化的量,这一秒是50%,下一秒也许就是80%了。

        或者是温度,今天是20度,明天可能就是18度了。Prometheus就是一个用Go编写的时序数据库

 

    @@ cAdvisor概述 @@

        Kubernetes的生态中,cAdvisor是作为容器监控数据采集的Agent,其部署在每个节点上

        kubernetes1.6开始 cAdvisor 被集成到kubernetes的kubelet中 ,可以在安装kubernetes通过参数激活 cAdvisor

        当前cAdvisor只支持http接口方式,也就是被监控容器应用必须提供http接口

 

    @@ Node-exporter概述 @@

        node-exporter 运行在节点上采集节点主机本身的cpu和内存等使用信息,并对外提供获取主机性能开销的信息。

        node-exporter两种部署方式

        1.通过Kubernetes的DeamonSet可以在各个主机节点上部署有且仅有一个NodeExporter实例,实现对主机性能指标数据的监控,

             但由于容器隔离原因,使用容器NodeExporter并不能正确获取到宿主机磁盘信息

        2.以守护进程的方式将NodeExporter部署到宿主机。

 

 

###########################exporter组件###########################

 

    @@ Prometheus社区提供了丰富的Exporter实现,涵盖了从基础设施,中间件以及络等各个⽅⾯的监控功能。这些Exporter可以实现部分通的监控需求

        范围常                               Exporter

        数据库     MySQL Exporter, Redis Exporter, MongoDB Exporter, MSSQL Exporter等

        硬件      Apcupsd Exporter,IoT Edison Exporter, IPMI Exporter, Node Exporter等

        消息队列   Beanstalkd Exporter, Kafka Exporter, NSQ Exporter, RabbitMQ Exporter等

        存储      Ceph Exporter, Gluster Exporter, HDFS Exporter, ScaleIO Exporter等

        HTTP服务  Apache Exporter, HAProxy Exporter, Nginx Exporter等

        API服务   AWS ECS Exporter, Docker Cloud Exporter, DockerHub Exporter, GitHub Exporter等

        志       Fluentd Exporter, Grok Exporter等

        监控系统   Collectd Exporter, Graphite Exporter, InfluxDB Exporter, NagiosExporter, SNMP Exporter等

        其他      Blockbox Exporter, JIRA Exporter, Jenkins Exporter, Confluence Exporter等

 

#########################K8S监控指标###########################

 

    @@ Kubernetes资源监控:使用kube-state-metrics。监控目标:Pod/Deploymet/Service

    @@ Pod监控:使用cAdvisor。监控目标:容器CPU,MEM等

    @@ Node监控:使用node-exporter。监控指标:节点CPU、MEM等

 

########################  监控node、pod ###########################

 

    @@ 使用Kubernetes的DeamonSet的部署方式 @@

   

        @@@ 下载镜像和软件包 ##

             在master节点下载

             安装git,并下载相关yaml文件

             git clonehttps://github.com/redhatxl/k8s-prometheus-grafana.git

            

             在所有node节点下载监控所需镜像

             docker pull prom/node-exporter

             docker pull prom/prometheus:v2.0.0

             docker pull grafana/grafana:4.2.0

       

        @@@ 部署客户端

             @@@@ 部署node-exporter组件,有两种方式部署node_export ##

                 @@@@@ DeamonSet部署方式,master节点上操作,会在所有node上生成一个pod,采集信息 @@

                

                     [root@k8scs001k8s-prometheus-grafana]# kubectl create -f /etc/k8s/k8s-cluster-install-yaml/node-exporter.yml

                     daemonset.apps/node-exportercreated

                     service/node-exportercreated

                    

                     [root@k8scs001k8s-prometheus-grafana]# kubectl get pods --all-namespaces|grep node

                     ………               

                

                 @@@@@ 宿主机守护进程方式安装,所有node上都要安装 @@

                

                     所有节点都要安装,包括mster

                     下载node_exporter-0.17.0.linux-amd64.tar.gz

                     启动nohup ./node_exporter2>&1 &

                     验证是否收集到node监控数据

                     http://192.168.1.161:9100/metrics   

                

        @@@ 部署服务端,prometheus组件,master节点上操作 ##

            

             @@@@ rbac文件

                 [root@k8scs001 ~]# kubectlcreate -f /etc/prometheus/prometheus-rbac.yml

                 ………          

            @@@@以configmap的形式管理prometheus组件的配置文件

                 [root@k8scs001 ~]# kubectlcreate -f /etc/prometheus/prometheus-configmap.yml

                 ………          

            @@@@Prometheus deployment 文件

                 [root@k8scs001 ~]# kubectl create-f  /etc/prometheus/prometheus-deploy.yml

                 ………

             @@@@ Prometheus service文件

                 [root@k8scs001 ~]# kubectlcreate -f /etc/prometheus/prometheus-svc.yml

                 service/prometheus created

                

        @@@ 部署服务端 metrics-server组件,用来使用top查看node/pod的cpu/mem的使用情况

            

             @@@@ 下载软件包

                 https://github.com/kubernetes-sigs/metrics-server/archive/v0.3.6.tar.gz

                 tar -zxvf v0.3.6.tar.gz

                

                 docker pullmirrorgooglecontainers/metrics-server-amd64:v0.3.6

                

             @@@@ 更改deployment文件

                 ………

                

             @@@@ 启动

                

                 [root@k8scs001 1.8+]# kubectlcreate -f /etc/k8s/metrics-server-0.3.6/deploy/1.8+/.

                 ………               

            @@@@采样node/pod性能指标

            

                 [root@k8scs001 1.8+]# kubectltop nodes

                 ………        

                 [root@k8scs0011.8+]# kubectl top pods --all-namespaces

                 NAMESPACE              NAME                                         CPU(cores)   MEMORY(bytes)  

                 ………               

            @@@@node上查看所有docker容器的数据流

                

                 [root@k8scs003 ~]# docker stats-a

                 ………

            

        @@@ 部署grafana组件,master节点上操作 ##

            

             @@@@ grafana deployment配置文件

                 [root@k8scs001 ~]# kubectlcreate -f  /etc/grafana/grafana-deploy.yaml

                 deployment.apps/grafana-corecreated

                 [root@k8scs001 ~]#

            

             @@@@ grafana service配置文件

                 [root@k8scs001 ~]# kubectlcreate -f   /etc/grafana/grafana-svc.yaml

                 service/grafana created

                 [root@k8scs001 ~]#        

            

             @@@@ 查看相关service

                 [root@k8scs001 ~]# kubectl getservice -n kube-system   

                 NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE

                 ………  

 

        @@@ 验证 ##

 

             @@@@ 查看node-exporter获取到的监控数据,容器方式启动,映射到宿主机的端口事31672,9100是docker内部的端口,prome采集的时候要使用31672

                 http://192.168.1.161:31672/metrics

            

             @@@@ prometheus dashbaard地址 ##

            

                http://192.168.1.165:30003

                 查看prometheus和k8s集群的链接状态

                 http://192.168.1.165:30003/targets

                 promql,调试

                 http://192.168.1.165:30003/graph

            

                 添加数据源

                 http地址,要是用service name,例如http://prometheus:9090,或者外网ip

                

             @@@@ grafana地址 ##

            

                 http://192.168.1.161:30106

 

##########################监控http(blackbox_exporter) #####################

 

    @@ blackbox_exporter 是 Prometheus 拿来对 http/https、tcp、icmp、dns、进行的黑盒监控工具,不需要安装在目标机器上即可从外部去监控。

 

  @@ 使用blackbox方式监控http

 

        @@@ 下载blackbox_exporter-0.16.0.linux-amd64.tar.gz文件

       

        @@@ blackbox.yml 文件内置了很多模块,可以在prometheus文件中定义job,引用这些模块

             [root@k8scs001 prometheus]# catblackbox.yml

             ………          

        @@@增加一个job,引用http_2xx模块

             [root@k8scs001 prometheus]# catprometheus-configmap.yml

            ………

            

             [root@k8scs001blackbox_exporter-0.16.0.linux-amd64]# nohup/etc/k8s/blackbox_exporter-0.16.0/blackbox_exporter--config.file="blackbox.yml" &

             ………

 

#########################监控kubernetes资源对象 #########################

 

    @@ 下载软件包 @@

   

        wget -O kube-state-metrics.zip  https://github.com/kubernetes/kube-state-metrics/archive/master.zip

 

    @@ 启动服务 @@

   

        cd/root/kube-state-metrics/examples/standard

        [root@k8scs001 standard]# ll

        total 20

        -rw-r--r-- 1 root root  381 Dec 18 22:08 cluster-role-binding.yaml

        -rw-r--r-- 1 root root 1744 Dec 18 22:08cluster-role.yaml

        -rw-r--r-- 1 root root 1149 Dec 18 22:08deployment.yaml

        -rw-r--r-- 1 root root  197 Dec 18 22:08 service-account.yaml

        -rw-r--r-- 1 root root  410 Dec 18 22:08 service.yaml

       

        [root@k8scs001 standard]#kubectl create-f .

       

        [root@k8scs001 ~]# kubectl get pods -nkube-system -o wide | grep metrics

        kube-state-metrics-75ff9d6878-cd9cc   1/1    Running   0          98m   10.244.1.129    k8scs002   <none>           <none>

       

        通过 /healthz 健康检查端口查看Pod状态。

        [root@k8scs001 ~]# curl10.244.1.129:8080/healthz

        ok

       

        通过 /metrics 接口可查看其采集的全量数据。

        [root@k8scs001 ~]# curl10.244.1.129:8080/metrics

 

    @@ 添加job @@

   

        接入Prometheus,在Prometheus 中添加一个 kube-state-metrics Job。

        - job_name: kube-state-metrics

         static_configs:

         - targets: ['kube-state-metrics.kube-system.svc.cluster.local:8080']

   

   

    @@ k8s service 域名的组成规则 @@

        name.namespace.svc.cluster.local

       

    @@ 安装nslookup命令 @@

        不是一个单独的包,是有的包里面带有这个命令,yum install -ybind-utils

 

#########################prometheus 监控数据持久化 #########################

 

    @@ nfs配置 @@

   

        yum -y install nfs-utils rpcbind

       

        [root@k8scs ~]# cat /etc/exports

        /data/k8s/prometheus *(rw,all_squash)

       

        必须赋予777权限

        [root@k8scs ~]#chmod -Rf 777/data/k8s/prometheus

       

        systemctl enable rpcbind

        systemctl enable nfs

        systemctl start rpcbind

        systemctl start nfs

       

        测试 另一台主机上挂载

        [root@k9scs ~]# mount -t nfs192.168.1.100:/data/k8s/prometheus /root/nfs_dir

       

    @@ 创建vlume @@

        [root@k8scs001 prometheus]# catprometheus-volume.yml

        ………

        [root@k8scs001prometheus]# kubectl create -f prometheus-volume.yml

       

    @@ 使用volume @@

        vi prometheus-deploy.yml

       

        配置容器挂载信息

        ………

                volumeMounts:

               - mountPath: "/prometheus"

                 subPath: prometheus

                 name: data

                 

        配置volume信息

        ………

             volumes:

             - name: data

               persistentVolumeClaim:

                claimName: prometheus

                

        @@@ 重启prometheus容器   

       

#######################grafana 配置数据持久化 #######################

 

    @@ mysql持久化 @@

   

        @@@ 建nfs

            

        @@@ 建pv

             [root@k8scs001 mysql]# catmysql-pvc.yml

             ………

        @@@deploy

             [root@k8scs001 mysql]# catmysql-deploy.yaml

             ………

        @@@建svc

             [root@k8scs001 mysql]# catmysql-svc.yaml

             ………

       

        @@@测试链接

       

             [root@k8scs001 mysql]# kubectl getpo -n mysql

             ………

           

            [root@k8scs001mysql]# kubectl exec -it mysql-d767f8b97-rk9nd -n mysql -- mysql -uroot-proot@123 -h10.244.2.150

             ………      

            

             @@@@@ 建库表 ##

             ………

       

    @@ 使用sqlite3持久化 @@

       

        @@@ 建pv、pvc ##

             [root@k8scs001 grafana]# catgrafana-volume.yaml

             ………

            [root@k8scs001grafana]# kubectl create -f grafana-volume.yaml

            

        @@@ 配置pv

             [root@k8scs001 grafana]#catgrafane-deploy.yaml

             ………

       [root@k8scs001 grafana]# kubectl create -f grafana-deploy.yaml

       

      @@@ 查看数据文件

        [root@k8scs001 grafana]# ll

             -rw-r----- 1 472 root 569344Jan  7 12:23 grafana.db

             drwxr-xr-x 2 472 root      6 Jan 7 11:29 plugins

             drwx------ 2 472 root      6 Jan 7 11:30 png

             映射/var目录,但是只有db文件映射过来了,log文件没有,原因待查

            

      @@@grafana启动日志

        里面记录了配置文件等关键信息

        [root@k8scs001 grafana]# kubectl get po--all-namespaces |grep grafa

             ………          

    @@ 验证 @@

             删除pod,重建以后,grafana配置信息还在

 

        @@ 检查service是否在

            ………

        @@ 检查pod状态是否正常

            ………

        @@ 检查service和pod的映射关系

             [root@k8scs001 kubernetes]# kubectlget endpoints kube-dns -n kube-system

             ………

       

        @@ 如果没有pod地址,检查service配置文件中的selector

             [root@k8scs001 kubernetes]# kubectlget service kube-dns -n kube-system -o json

             ………

             "selector": {

                "k8s-app": "kube-dns"

              },

             ………     

     @@ 同时检查pod的lable,看是否与service中对应

         [root@k8scs001kubernetes]# kubectl get pod coredns-6d56c8448f-76gtz -n kube-system -o json

     ………

        "labels": {

            "k8s-app":"kube-dns",

            "pod-template-hash":"6d56c8448f"

        },

     ………

     

      或者

      [root@k8scs001 ~]# kubectl get pod--show-labels -n kube-system

             ………          

            或者,使用标签查看pod

[root@k8scs001 ~]#kubectl get pod -l k8s-app=kube-dns -n kube-system

             ………

       

########################  alertmanager报警配置 #######################

 

    @@ prometheus的报警流程是,根据rule规则,判断出需要报警的信息,然后把该信息推送给alertmanager,后者负责发送报警邮件或信息

 

    @@ 下载镜像,使用境外服务器下载会很快,国内网络不稳定

   

        docker pull https://hub.docker.com/r/prom/alertmanager/tags/prom/alertmanager:v0.21.0

       

    @@ 配置alertmanager

   

        @@@ configmap,报警邮箱服务器信息在这里配置

       

             [root@k8scs001alertmanager-0.21.0]# cat alertmanager-configmap.yaml

             apiVersion: v1

             kind: ConfigMap

             metadata:

              namespace: kube-system

              name: alertmanager-config

             data:

              alertmanager.yml: |

                global:

                   resolve_timeout: 5m

                   smtp_smarthost: 'smtp.qq.com:25'

                   smtp_from: '8173960@qq.com'

                   smtp_auth_username: '8173960@qq.com'

                   smtp_auth_password: 'hkqvojbjlexxbghj'

                   smtp_require_tls: false  

            

                receivers:

                - name: default-receiver

                   email_configs:

                   - to: "trqyl@163.com"

                     send_resolved: true      

            

                route:

                   group_interval: 1m 

                   group_wait: 10s

                   receiver: default-receiver

                   repeat_interval: 1m         

       

        @@@ deployment,将alertmanager-config挂载进去

       

             [root@k8scs001alertmanager-0.21.0]# cat alertmanager-deployment.yaml

             ………

           

        @@@ service

       

             [root@k8scs001alertmanager-0.21.0]# cat alertmanager-svc.yaml

             ………

           

        @@@ 启动

       

             [root@k8scs001alertmanager-0.21.0]# kubectl create -f /etc/k8s/alertmanager-0.21.0/.

       

    @@ prometheus关联alertmanager

   

        @@@ 将报警规则以configmap的形式保存

       

             [root@k8scs001 prometheus]# catprometheus-alert-rule.yml

             ………

             [root@k8scs001 prometheus]# kubectlcreate -f  prometheus-alert-rule.yml

       

        @@@ 将上面报警规则文件映射到prometheus-deploy中

       

             [root@k8scs001 prometheus]# catprometheus-deploy.yml

             ...............................................

           - mountPath: "/etc/rule"

             name: alert-config

           resources:

             requests:

               cpu: 300m

               memory: 100Mi

             limits:

               cpu: 400m

               memory: 2500Mi

             ………

         - name: alert-config

           configMap:

             name: k8s-mon-rules

             ………

       

        @@@ 配置prometheus-config文件,两部分,一个是alerting,一个是rule_files

            

             ***** rule_files文件不是宿主机文件路径,而是docker容器内部的文件路径,路径为:deploy中mountPath/k8s-mon-rules中data部分的文件名,本例为/etc/rule/k8s-pgmon.yaml *****

            

             [root@k8scs001 prometheus]# catprometheus-configmap.yml

             ………

           

             @@@@ docker中查看报警规则文件

            

             [root@k8scs006 ~]# docker exec -it574d34355d79 /bin/sh

             /prometheus # ls /etc/rule/

             k8s-pgmon.yaml

            

        @@@ 重启prometheus,检查alert与rules

       

########################压力测试########################

 

    @@ ab -k -r -c 1000 -n 20000000http://192.168.1.160:32692/index.html

 


文章转载自戏水蓝鲸,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论