疫情的影响,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