更换Ubuntu Server 16.04软件源为国内阿里云源

大伟哥在Ubuntu Server 16.04更新系统软件包一文中提到过,如果你在国内使用Ubuntu Linux系统,可以考虑把Ubuntu的软件源换成国内的,这样下载安装软件就会比较快。

什么是Ubuntu的软件源?

我们在使用Debian或者Ubuntu的apt-get工具来安装需要的软件时,其实就是从服务器获取需要安装的软件并把它安装在本地计算机的过程。所谓的软件源,就是我们获取软件的来源,它是定义在/etc/apt/sources.list文件里的。

默认的sources.list文件内容如下:

# 

# deb cdrom:[Ubuntu-Server 16.04.2 LTS _Xenial Xerus_ - Release amd64 (20170215.8)]/ xenial main restricted

#deb cdrom:[Ubuntu-Server 16.04.2 LTS _Xenial Xerus_ - Release amd64 (20170215.8)]/ xenial main restricted

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://us.archive.ubuntu.com/ubuntu/ xenial main restricted
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates main restricted
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-updates main restricted

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://us.archive.ubuntu.com/ubuntu/ xenial universe
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial universe
deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates universe
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-updates universe

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu 
## team, and may not be under a free licence. Please satisfy yourself as to 
## your rights to use the software. Also, please note that software in 
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://us.archive.ubuntu.com/ubuntu/ xenial multiverse
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial multiverse
deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates multiverse
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-updates multiverse

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://us.archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse

## Uncomment the following two lines to add software from Canonical's
## 'partner' repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu xenial partner
# deb-src http://archive.canonical.com/ubuntu xenial partner

deb http://security.ubuntu.com/ubuntu xenial-security main restricted
# deb-src http://security.ubuntu.com/ubuntu xenial-security main restricted
deb http://security.ubuntu.com/ubuntu xenial-security universe
# deb-src http://security.ubuntu.com/ubuntu xenial-security universe
deb http://security.ubuntu.com/ubuntu xenial-security multiverse
# deb-src http://security.ubuntu.com/ubuntu xenial-security multiverse

可以看到,官方的默认源是来自美国的us.archive.ubuntu.com和security.ubuntu.com。那么我们怎么样换成速度更快的国内源呢?很简单,把/etc/apt/sources.list文件复制备份一下,然后把原来的内容修改成国内源的网址即可。以下步骤说明以阿里云的源为例:

1、复制备份原来的配置文件

sudo cp /etc/apt/sources.list sources.list.bak

2、使用你喜欢的文本编辑器如vi/vim/nano,打开sources.list文件,把原来的内容替换成以下内容:

deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse  
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse  
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse  
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse  
##测试版源  
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse  
# 源码  
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse  
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse  
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse  
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse  
##测试版源  
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse  
# Canonical 合作伙伴和附加  
deb http://archive.canonical.com/ubuntu/ xenial partner  
deb http://extras.ubuntu.com/ubuntu/ xenial main  

3、运行sudo apt-get update命令,更新软件列表,以后就可以使用阿里云提供的快速源了。同样的方法,也可以替换为网易源、搜狐源、中科大源、清华大学源等。

Supervisor Install for CentOS 6.9 final

1、下载压缩包

https://github.com/Supervisor/supervisor/releases

supervisor-3.3.3.tar.gz下载:

https://www.veryecs.com/zb_users/upload/2017/08/201708281503928458214480.gz

2、解压

# tar -zxvf supervisor-3.3.3.tar.gz

# cd supervisor-3.3.3

# python setup.py install

3、创建配置

# echo_supervisord_conf > /etc/supervisord.conf

4、添加配置

#whereis php
[program:php]

command=/usr/bin/php think queue:work --queue queue_name --daemon ;被监控进程

directory=/www/root/xxxx.com

;process_name=%(process_num)02d

;numprocs=5 ;启动几个进程

autostart=true ;随着supervisord的启动而启动

autorestart=true ;自动启动

startsecs=1 ;程序重启时候停留在runing状态的秒数

startretries=10 ;启动失败时的最多重试次数

redirect_stderr=true ;重定向stderr到stdout

stdout_logfile=/root/supervisor.log ;stdout文件

5、开启supervisord服务

# supervisord -c /etc/supervisord.conf

查看正在守候的进程

# supervisorctl

更新新的配置到supervisord

# supervisorctl update

重新启动配置中的所有程序

# supervisorctl reload

启动某个进程(program_name=你配置中写的程序名称)

# supervisorctl start program_name

重启某一进程 (program_name=你配置中写的程序名称)

# supervisorctl restart program_name

停止全部进程

# supervisorctl stop all

阿里云CentOS 7配置sftp并禁止登录ssh

背景

之前写过一篇关于centos 7 配置 ftps 的文章,地址在 https://www.92ez.com/?action=show&id=23450 ,银行大大的需求说改就改,ftps配置完测试完成就该需求了,要求我方配置sftp给他们,我甚至都怀疑是当时他们打字打错了,sftp打成了ftps,当时我还再三确认是不是写错了,对方回答没问题就是ftps,现在又改成sftp….算了,不纠结这个问题,毕竟银行才是大佬,他们说啥就是啥。今天就配置一下sftp。

需求

对方的需求是需要一个sftp服务器用于下载我方上传的报表文件,其他的没有什么要求。对于我方来说这个需求也是很简单,配置一个sftp的账号限制一下目录并且禁止登录ssh即可。

配置

在Linux下面需要对目录进行限制,防止用户跳出目录越权到其他不应该进入的路径就需要使用chroot,并不是所有的系统都支持chroot, openssh 4.8p1以后的版本才会有chroot功能,显然CentOS 7 的openssh版本肯定是满足条件的。使用如下命令查看openssh的版本

$ ssh -V
OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips 11 Feb 2013

确定openssh版本满足条件后继续配置。

建立sftp用户的目录

sudo mkdir banksftp

创建组和用户

sudo groupadd sftp && sudo sudo useradd -g sftp -s /bin/false banksftpuser

修改sftp账号的密码

sudo passwd banksftpuser

输入密码后指定sftp用户banksftpuser的home目录

sudo usermod -d /data/sftp/banksftp banksftpuser

修改ssh的配置文件

找到如下这行,并注释掉

Subsystem      sftp    /usr/libexec/openssh/sftp-server  

添加如下几行

Subsystem       sftp    internal-sftp  
Match User banksftpuser #匹配用户   
ChrootDirectory /data/sftp/banksftp # 限制用户目录  
ForceCommand    internal-sftp  
AllowTcpForwarding no  
X11Forwarding no 

设置目录权限

sudo chown root:sftp /data/sftp/banksftp && sudo chmod 755 /data/sftp/banksftp

重启ssh服务后测试是否能够正常登录。

然而,报错了…

Connection to 119.*.*.* closed by remote host.
Couldn't read packet: Connection reset by peer

查看ssh登录日志发现如下

Aug 29 12:06:16 myvps systemd-logind: New session 6 of user banksftpuser.
Aug 29 12:06:16 myvps systemd: Started Session 6 of user banksftpuser.
Aug 29 12:06:16 myvps systemd: Starting Session 6 of user banksftpuser.
Aug 29 12:06:16 myvps systemd-logind: Removed session 6.
Aug 29 12:06:16 myvps systemd: Removed slice user-1004.slice.
Aug 29 12:06:16 myvps systemd: Stopping user-1004.slice.

看起来似乎没有问题,经过各种谷歌终于解决,其实问题就是出在目录的归属上,chroot限制的目录的所有上级都必须归属root:root,而我当前的目录的上级是user:user所以死活不行,修改成root:root后成功登录。

banksftpuser@119.*.*.*'s password: 
Connected to 119.*.*.*.
sftp> 

测试使用ssh 登录看是否禁止登录

~$ ssh banksftpuser@119.*.*.*
banksftpuser@119.*.*.*'s password: 
Could not chdir to home directory /data/sftp/banksftp: No such file or directory
This service allows sftp connections only.
Connection to 119.*.*.* closed.

Linux shell:利用sed批量更改文件名

一、示例

1、去除特定字符

目标:将 2017-01-01.jpg、2018-01-01.jpg 改为 20170101.jpg、20180101.jpg
方法:将所有 – 替换为空

for file in `ls | grep .jpg`
do
    newfile=`echo $file | sed 's/-//g'`
    mv $file $newfile
done

这里使用sed进行标准输出的字符串替换,其通用格式如下:

stdout | sed 's/pattern/replace/'

上述示例中,在末尾添加g用于替换所有匹配项,而不仅仅替换第一个匹配项。

2、中间插入字符

目标:将 book01.txt、paper02.txt 改为 book-01.txt、paper-02.txt

方法:用分组匹配分别获取待插入位置两侧的字符串,再通过反向引用实现替换

for file in `ls | grep .txt`
do
    newfile=`echo $file | sed 's/([a-z]+)([0-9]+)/1-2/'`
    mv $file $newfile
done

二、分析

上述示例首先通过 ls 和 grep 命令得到待改名的文件列表,然后用 sed 命令进行字符串的替换,最后再使用 mv 命令来完成文件名的更改。

获取待改名文件列表的方法有很多,可以通过 find 命令,也可以直接给出字符串,我们将在下文中提到。

注意 for 循环后面的 ls | grep .txt,这条命令用两个反单引号括了起来,与 $(ls | grep .txt) 的作用相同,被包围的字符串会被当作命令执行,然后返回字符串结果。

1、文件名包含空格的解决方法

我们可以直接将文件列表写到 for 循环中,而不是通过命令来得到,例如:

for file in "file1 file2 file3"
do
    ...
done

可以看到 for 循环是通过空格来分割字符串,因此如果待更改的文件名中包含空格的话,就会被拆分成多个文件名,从而出错。

要解决这个问题,我们可以将 IFS(内部字段分隔符)设置为换行符 n,这样一来,for 循环就会按行来获取变量的值,确保每次获取的确实是一个完整的文件名。

设置 IFS 变量的命令需要放在 for 循环之前:

IFS=$'n'
for file in `ls`
do
    ...
done

也可以直接使用 while read 命令一次读取一行到变量 file 中:

ls | grep "*.txt" | while read file
do
    ...
done

2、使用 find 获取文件列表

之前的示例中,我们是通过 ls 命令来获取文件列表。该命令只能获取某个目录的文件,而且没法进行多种条件的筛选。

而一说到文件的查找,不得不提到功能强大的 find 命令。该命令可以在多个层次的目录中查找文件,并能够设定诸如创建时间、文件大小、所有者等多种条件,查找起文件来特别方便灵活。

用 find 命令来获取文件列表,再用 sed 命令配合正则表达式来修改文件名,这两个命令的结合几乎能完成所有常见的批量改名任务。

例如,将所有大于1M,且后缀为txt或jpg的文件,由形如 book_20170101.txt、image_20170101.jpg 的文件改名为 20170101-book.txt、20170101-image.jpg,代码如下:

for file in `find . -size +1M -name "*_*.txt" -o -name "*_*.jpg"`
do
    newfile=`echo $file | sed 's/([a-z]+)_([0-9]+)./2-1./'`
    mv $file $newfile
done

KVM虚拟机迁移至esxi的基本流程

0x01 前言

在使用esxi之前我是用KVM作为我的虚拟化平台,在购买R720后更换为esxi。而KVM平台上有些虚拟机需要做迁移,然后就有了这一篇文章。

过程非常简单,只需要几行命令,最后在esxi上创建虚拟机即可。

0x02 准备

首先需要准备好esxi主机;然后在KVM上找到需要迁移的虚拟机的镜像所在的绝对路径;最后需要找到esxi主机上数据存储的绝对路径,这一步需要通过SSH登入esxi主机,通过以下步骤打开esxi主机的SSH服务:

未分类

通过浏览器登入esxi主机,在“主机”标签中找到“操作”按钮在“服务”选项中打开SSH服务。

我的KVM和esxi相关路径如下:

  • KVM镜像路径:/usr/local/kvm/images/centos-t1.img
  • esxi存储路径:/vmfs/volumes/datastore_1/

在这里先在esxi主机里建立一个文件夹,文件夹的名称为虚拟机的名称:

#进入数据存储
[root@server2:~] cd /vmfs/volumes/datastore_1/

#新建文件夹
[root@server2:/vmfs/volumes/52540d02-86fc97d5-c7a2-d8d38597d7aa] mkdir test-1

使用以下命令可以查看KVM虚拟机的信息:

#列出所有虚拟机,包含已关闭电源的虚拟机
[root@kvm-t1 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     test-1                         shut off

#查看虚拟机信息
[root@kvm-t1 ~]# virsh dominfo test-1
Id:             -
Name:           test-1
UUID:           12079e65-01e5-4928-a552-7cd57f473185
OS Type:        hvm
State:          shut off
CPU(s):         1
Max memory:     524288 KiB
Used memory:    524288 KiB
Persistent:     yes
Autostart:      disable
Managed save:   no
Security model: none
Security DOI:   0
0x03 KVM 镜像

我的虚拟机镜像使用qcow2格式,进入虚拟机配置文件编辑模式:

[root@kvm-t1 ~]# virsh edit test-1

定位到磁盘节点,在type节点中就是磁盘的格式:

...
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/usr/local/kvm/images/centos-t1.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
...

在将KVM虚拟机镜像迁移至esxi之前需要先转换格式,先进入虚拟机镜像所在目录:

#进入目录
[root@kvm-t1 ~]# cd /usr/local/kvm/images/

#查看镜像
[root@kvm-t1 images]# ll -h
total 2.1G
-rw------- 1 root root 11G Sep  1 10:52 centos-t1.img

磁盘的格式需要转换两次,这一次是在KVM主机上进行,转换为vmdk格式。可是这个镜像还不能直接应用在esxi主机中,还需要在esxi主机转换一次。

在KVM主机中使用以下命令将虚拟机镜像进行转换:

qemu-img convert -f qcow2 centos-t1.img -O vmdk centos-t1_temp.vmdk -o compat6

为了防止镜像被拆分为2GB的小块,需要增加compat6的选项。

需要注意的是,转换过程中并不会出现进度条,完成转换后会出现一个新的镜像:

[root@kvm-t1 images]# ll -h
total 4.2G
-rw------- 1 root root  11G Sep  1 10:52 centos-t1.img
-rw-r--r-- 1 root root 2.1G Sep  1 16:19 centos-t1_temp.vmdk

然后将转换后的镜像复制一份到esxi主机中,你可以使用sftp进行复制,也可以将镜像从KVM主机中下载到本地,再通过esxi的web界面上传:

未分类

0x04 esxi 镜像

接下来通过SSH登入esxi主机并进入相关目录:

#进入相关目录
[root@server2:~] cd /vmfs/volumes/52540d02-86fc97d5-c7a2-d8d38597d7aa/test-1

#查看镜像信息
[root@server2:/vmfs/volumes/52540d02-86fc97d5-c7a2-d8d38597d7aa/test-1] ls -lh
total 2166784
-rw-r--r--    1 root     root        2.1G Sep  1 07:34 centos-t1_temp.vmdk

在esxi主机里,使用vmkfstools命令进行格式转换:

#转换成精简备置的磁盘
[root@server2:/vmfs/volumes/52540d02-86fc97d5-c7a2-d8d38597d7aa/test-1] vmkfstools -i centos-t1_temp.vmdk -d thin centos-t1.vmdk 
Destination disk format: VMFS thin-provisioned
Cloning disk 'centos-t1_temp.vmdk'...
Clone: 100% done.

到这里就完成对镜像的操作,如果不需要KVM的镜像,可以将其删除:

[root@server2:/vmfs/volumes/52540d02-86fc97d5-c7a2-d8d38597d7aa/test-1] rm -f centos-t1_temp.vmdk

0x05 虚拟机

完成镜像的操作,我们需要手动建立虚拟机并指定镜像位置。通过正常的虚拟机建立流程建立虚拟机:

未分类

在自定义硬件步骤中可以将光驱、软驱和自动添加的磁盘删除,如果不需要SCSI驱动器,也可以一并删除。

然后添加一个新设备,选择“现有磁盘”,并选择上一步转换的磁盘:

未分类

完成后后类似这样:

未分类

完成后启动虚拟机即可:

未分类

0x06 结语

我有好几台KVM虚拟机都使用以上方法迁移至esxi平台,经过将近一年的运行,一切正常。

KVM+Qemu+Libvirt实战

上一篇的文章是为了给这一篇文件提供理论的基础,在这篇文章中我将带大家一起来实现在linux中虚拟出ubuntu的server版来

我们需要用KVM+Qemu+Libvirt来进行kvm全虚拟化,创建虚拟机并管理。

kvm是用来虚拟化或者说模拟CPU、内存等硬件的。
QEMU只是用来虚拟化硬盘的
libvirt提供了整个虚拟机的管理,比如说虚拟机的启动,停止,创建,删除等等。

其实KVM+Qemu+Libvirt就是模拟了一个VMWare软件

环境:
    
– 宿主机:ubuntu16.04的server版
– kvm虚拟化中安装的虚拟化操作系统为:ubuntu16.04的server版

在这里中一定要记住不能使用VMWare中的ubuntu当宿主机去做KVM虚拟化,因为VMWare本身已经是虚拟化的了。

一、KVM支持检测及模块安装

1、KVM支持检测

    
CPU检测:sudo kvm-ok
    
如果出现左边的提示,则表示支持kvm

grep vmx /proc/cpuinfo

2、安装KVM模块

    

sudo apt install kvm 

模块启动检测:lsmod |grep kvm

二、虚拟磁盘管理

 

1、安装qemu-utils工具

    

sudo apt install qemu-utils

2、对/dev/vdb分区为vdb1,挂载到”/vdb1″

    
这个步骤在linux教程的文章中有,不懂得可以去查看
  

3、创建虚拟磁盘

    

sudo qemu-img create -f qcow2 /zyhdata/us1.qcow2 30G

运行结果
        

4、虚拟磁盘文件的检查

    

sudo qemu-img info /zyhdata/us1.qcow2

三、libvirtd配置

  

1、安装libvirtd工具

    

sudo apt install vitinst

2、检测该工具是否安装

    

ps -ef|grep -i libvirtd  查看是否有libvirtd进程

3、sudo vi /etc/libvirt/libvirtd.conf

    
这些内容在该文件中或许都已经存在,也有可能是以注释的形式体现的,取消注释,如果值和上面中的不符合,就改成上面中的值。

4、修改libvirt-lib文件

    

sudo vi /etc/default/libvirt-bin中修改其中的libvirtd_opts="-d -l"

5、修改qemu.conf文件

    

sudo vi /etc/libvirt/qemu.conf中修改其中的vnc_listen="0.0.0.0"

 

6、重启libvirt-bin服务

    

sudo service libvirt-bin restart

    
注意:如果你将你的Ubuntu操作系统升级到了16.10(04)版本,libvirt-bin服务跟操作系统由冲突,不能这样重启服务。只能是重启操作系统。

sudo reboot

四、创建或安装(虚拟)操作系统

  

1、命令安装

  • 使用virt-install命令进行安装,一步一步的执行

未分类  

我们就这样在console中一行一行的往下走。

  • 使用shell脚本来安装

使用shell脚本安装(代替上面的1)),省得我们一行一行在console敲。  

create_kvm.sh文件   

DIST_QCOW2=$2                                                               
ORIGN_ISO=$3

sudo virt-install 
--connect qemu:///system 
--name $1 
--ram 2048 
--vcpus=2 
--disk path=${DIST_QCOW2},format=qcow2,size=20,bus=virtio 
--cdrom $ORIGN_ISO 
--vnc 
--os-type linux 
--accelerate 
--hvm 
--network bridge=virbr0,model=virtio 
--noautoconsole

注意:在上面的脚本文件中代表的是续行符。在shell中已经使用的sudo

接下来就是运行脚本进行安装了:        

shell/create_kvm.sh us1 /vdb1/us1.qcow2 /iso/ubuntu-17.04-server-amd64.iso 
  注意:
      在这里脚本中有三个参数:
                  第一个为虚拟机名字
                  第二个为指定的虚拟磁盘
                  第三个为ubuntu系统的镜像文件

注意:镜像文件的选取:搭建集群保证所有的服务器的操作系统类型和操作系统版本以及内核版本最好都一致。 
      
sudo apt dist-upgrade 升级软件以及内核

  • 使用virsh命令

virsh list –all查看你所有虚拟机的情况
visrh list 查看正在运行的虚拟机的情况

未分类

  • 使用vnc-viewer检测系统

这里需要安装vnc viewer软件的,没有的话可以去我的博客中的随笔分类tools中下载

作用:我们虚拟机已经在安装ubuntu系统了,但是后面有些安装过程中需要认为去操作的,所以我们需要去使用vnc viewer去检测它的安装

url:host_ip:vnc编号(virsh vncdisplay vmname进行查看)

未分类 

未分类

进入这里就是我们熟悉的安装ubuntu的过程了。不知道怎么安装ubuntu的server版的可以去我的博客中的随笔分类tools中下载

总结:至此,第一种创建虚拟机的方式就完成了,其实这种创建时非常的繁琐的。但是可以知道它的安装整个过程

2、第二种创建虚拟机的方式

(生成相应的xml文件+qcow2文件=虚拟机)
     
在上面我们已经安装了一个ubuntu系统,所以在us1.qcow2虚拟磁盘中是有ubuntu系统文件的和相对应的xml文件的。

  • 复制us1.qcow2到us2.qcow2

未分类     

  • 复制us1.xml到us2.xml

未分类    

  • 修改us2.xml文件中的四个地方      
    • 修改xml文件中的虚拟机名称。us2中的内容。
    • 修改UUID,16进制的值,随便修改其中几个值即可。
    • 修改新的虚拟机配置中的磁盘(虚拟磁盘文件)信息。
    • 修改MAC地址,16进制的值,随便修改其中几个值即可。
  • 重启libvirt-bin服务。如果重启该服务有错,请重启宿主机

未分类      

总结:使用这种安装非常的方便,只需要复制两个文件,修改一个文件就可以了。我这里会提供来两个文件给需要的人,可以去我的博客中的随笔分类tools中下载    

3、第三种创建虚拟机的方式:virt-manager

      
首先你需要去安装这个软件

sudo apt install virt-manager
  • 终端输入
virt-manager

未分类      

  • file–>add connection

选中connection remote host

未分类    

file–>create new virtual machine

第一步:

未分类
        
第二步:

未分类
        
第三步:

未分类

接下来可以自己去尝试我就不详细解释了

五、虚拟机管理、虚拟机域管理、虚拟磁盘管理

  

1、虚拟机管理

未分类

2、虚拟机域管理

未分类

3、虚拟磁盘管理

未分类

kubernetes构建一套基础tomcat8 jdk8镜像

1、RC类型tomcat基础镜像

#1、编写yaml文件
apiVersion: v1 #api版本 固定
kind: ReplicationController  #kind类型ReplicationController
metadata:   
  name: zk-web
spec:           #spec.selector是RC的pod选择器,spec.selector是RC的pod选择器,确保当前集群上始终有且仅有replicas个pod实例运行,这里我们spec.replicas=1表示只能运行一个(名为的zk-web)pod 实例
  replicas: 1   #指启动几个副本
  selector:     #pod选择器
    app: zk-web
  template:     #当集群中运行的pod数量小于replicas时,RC会根据spec.template 段定义的pod模版来生成一个新的pod实例,labels属性指定了该pod的标签,这里的labels必须匹配RC的spec.selecto
    metadata:
      labels:
        app: zk-web
    spec:       #spec.image表示镜像地址。
      containers:
        - name: zk-web
          image: harbor.suixingpay.com/study/tomcat-app:v2
          ports:   #表示容器服务的端口
          - containerPort: 8080
          env:  #表示定义环境变量
          - name: MYSQL_SERVICE_HOST
            value: 'zk-mysql'
          - name: MYSQL_SERVICE_PORT
            value: '3306'

2、TOMCAT Docerfile

FROM harbor.suixingpay.com/study/centos:6.7
RUN yum install wget -y
RUN wget -O /etc/yum.repos.d/epel.repo http://172.16.132.241/epel/epel.repo
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo http://172.16.132.241/centos/CentOS-Base.repo
RUN yum makecache fast
RUN yum install tar  wget openssl openssh-server sudo  -y
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN echo "root:root" | chpasswd
##优化
RUN echo '*               -       nofile          65535 ' >>/etc/security/limits.conf
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# install JDK1.8
RUN  wget http://172.16.132.241/soft/jdk/8u111/jdk-8u111-linux-x64.tar.gz
RUN  tar zxvf jdk-8u111-linux-x64.tar.gz  -C /opt
#RUN echo 'JAVA_HOME="/opt/jdk_1.8"' >>/etc/profile
#RUN echo 'CLASSPATH="$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib"'>>/etc/profile
#RUN echo 'PATH="$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOMR/bin"' >>/etc/profile
ENV JAVA_HOME /opt/jdk1.8.0_111
ADD apache-tomcat-8.0.14.tar.gz /opt
RUN cd /opt/ && ls
EXPOSE 22
EXPOSE 8080
#RUN cd /opt/ && ls &&tar zxvf /opt/apache-tomcat-8.0.14.tar.gz
ENV CATALINA_HOME /opt/apache-tomcat-8.0.14
ENV PATH $PATH:$CATALINA_HOME/bin
ADD tomcat.sh /etc/init.d/tomcat
RUN chmod +x /etc/init.d/tomcat
#CMD ["/opt/tomcat.sh start"]
# /sbin/service sshd start
ENTRYPOINT /sbin/service sshd start &&  /sbin/service tomcat start && tail -f /opt/apache-tomcat-8.0.14/logs/catalina.out
#EXPOSE 22
#EXPOSE 8080
##tomcat.sh
export JAVA_HOME=/opt/jdk1.8.0_111
export TOMCAT_HOME=/opt/apache-tomcat-8.0.14
case $1 in
start)
  sh $TOMCAT_HOME/bin/startup.sh
;;
stop)
  sh $TOMCAT_HOME/bin/shutdown.sh
;;
restart)
  sh $TOMCAT_HOME/bin/shutdown.sh
  sh $TOMCAT_HOME/bin/startup.sh
;;
esac
exit 0
##生成镜像
[root@k8s-harbor01 tomcat]# docker build -t harbor.suixingpay.com/zhaikun/cent_tomcat:3.1 .
[root@k8s-harbor01 tomcat]# docker push harbor.suixingpay.com/zhaikun/cent_tomcat:3.1

3、RC类型基础镜像

apiVersion: v1
kind: ReplicationController
metadata:
  name: zk-jdk-tomcat
spec:
  replicas: 1
  selector:
    app: zk-jdk-tomcat
  template:
    metadata:
      labels:
        app: zk-jdk-tomcat
    spec:
      containers:
        - name: zk-jdk-tomcat
          image: harbor.suixingpay.com/zhaikun/cent_tomcat:3.1
          ports:
          - containerPort: 8080

4、SERVER类型基础镜像

apiVersion: v1
kind: Service
metadata:
  name: zk-jdk-tomcat
spec:
  type: NodePort
  ports:
    - port: 8080
      nodePort: 30009
  selector:
    app: zk-jdk-tomcat

Kubernetes 应用故障的一些定位方法

常备工作

准备一个工具镜像

其中包含 nslookup, ping, curl, 甚至是 ab、siege 等常用工具以及一个顺手的 Shell。一言不合就可以用静态 Pod 的方式将其运行到 Kubernetes 之中进行内部诊断。

sysctl -a | grep forwarding

你猜这是干啥的?

服务状态查询

各个 Kubernetes 组件的状态检查。可以使用 Ansible 之类的工具进行快速查询。

Service 不通

这里我们首先假设 Pod 工作正常

目前我们的应用均采用的是 NodePort 模式对外提供服务:

  • 逻辑:Service 将 符合其选择器的 Pod 暴露的端口 从 各个 Node 的同一端 口暴露出来对外进行监听。

  • 技术:Kube-proxy 通过网络插件,一般利用 Iptables vxLan 等乌七八糟的蜜汁技术,完成对外服务负载均衡,并分发给各个 Pod 的内部 IP 的相应端口。

前面我们假设 Pod 是正常工作的,因此,这里只考虑 Service 的情况。

通过上面的陈述我们能看到大致的一些要素,下面从内向外进行列表:

Pod 能够正常工作

见后文

Service 的选择器能够正确的找到 Pod

这里我们可以使用kubectl describe svc panic-service命令,查看输出内容的endpoint一节内容,如果其中有 Pod 地址,也就说明选择器和 Pod 的标签是匹配的。如果为空,则需要对服务或者 Pod Controller 的定义进行排查。

Proxy 的工作状态

  • 首先可以使用systemctl -l Kube-proxy来查看服务状况。

  • 还可以使用其他 Node 的同一端口测试访问,看是否单一节点的故障。

DNS 工作状态

Kubectl 查看 DNS 各个 Pod 的存活状态。

利用上面提到的工具 Pod 尝试解析服务。失败了其实也没啥办法,删 DNS Pod 重启吧。

端口是否定义正确

看 Pod 的端口是否能够正确侦听,是否符合服务定义。例如 Service 定义了到 Pod 8080 端口的访问,而 Pod 开放的却是 80,这样的情况跟标签无法匹配一样,是很常见的问题。

说完了服务,我们来说说 Pod

两个顺手的命令

kubectl get po -o wide | grep -v Running kubectl describe po unhealthy

一般来说,一个行为端正的 Pod,应该是以 Running 状态持续运行的。在进入 Running 之前,大致有调度、创建、初始化等几个环节,如果正常运行之后出了故障,会发生重启。如果在启动容器内进程时出现问题,则会进入 CrashLoopBackOff 的状态。

除了 Running/Complet 以及 CrashLoopBackOff

这几种情况其实不同,不过随性写到这,就不深究了,首先是 describe 一下。

Pod 启动有几个条件:

  • 有符合要求的节点供其运行
    • Taint 隔离的节点,要求 Pod 有显式声明对该种 Taint 的容错能力,才可以在其上运行。
    • 节点和 Pod 的亲和性定义
    • Node Selector 的定义
  • 符合其需求的资源
    • CPU 和 内存的 request limit 定义
    • 可能存在的第三方资源需求定义
    • 加载卷(nfs gluster ceph 等)/Secret/Configmap 的定义
  • 镜像必须存在,可 Pull

调度部分一般来说查看 Pod 定义,和节点的 Describe 进行匹配即可,Describe 内容中也会明确说出无合适 Pod。

资源部分 CPU 和内存的 Describe 结果也会很明显。

存储部分,往往就需要更复杂的排查:

  • 首先看看是不是每个 Node 都如此。

  • 是否安装了对应的客户端驱动。

  • 对分布式存储的访问网络是否可用。

  • 存储服务容量是否足够分配。

  • 是否能够成功的手工 Mount。

至于对 ConfigMap 和 Secret 的依赖,很简单,Kubectl 查询即可。

CrashLoopBackOff 以及 Restart 大于 1

这种情况一般来说属于业务内部的问题,可以通过 kubectl logs -f 命令进行查看,目前经验比较多的非业务情况是:

  • 对于 Kubernetes API 进行访问的应用,经常会是因为RBAC 权限不足导致无法启动

  • 依赖的 Service 无法访问。

Kubernetes主机间curl cluster ip时通时不通

1. 问题现象

测试部署了一个service,包括2个pod,分别在node1和node2上。

[root@k8s ~]# kubectl get svc 
NAME        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
nginx-svc   10.254.216.26   <none>        80/TCP    43m
[root@k8s ~]# kubectl get pod
NAME                                READY     STATUS    RESTARTS   AGE
busybox                             1/1       Running   3          65d
nginx-deployment-4087004473-d3tkv   1/1       Running   0          9m
nginx-deployment-4087004473-gdm3q   1/1       Running   0          54m

在node1(或者node2)上curl 10.254.216.26(cluster ip),只有当负载到本地pod时正常,curl <本地pod ip和另一个主机pod ip>是正常的。

2. 解决方案

参考 https://stackoverflow.com/questions/34639185/communication-failing-between-kubernetes-nodes-and-clusterip 添加路由后,

ip route add 10.254.0.0/16 dev flannel.1

主机间可以通信,但是本地pod不正常了。

删除上述路由信息,添加路由如下路由解决。

ip route add 10.254.0.0/16 dev docker0

k8s部署之使用CFSSL创建证书

一、安装CFSSL

curl -s -L -o /bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
curl -s -L -o /bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
curl -s -L -o /bin/cfssl-certinfo https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x /bin/cfssl*

二、容器相关证书类型

  • client certificate: 用于服务端认证客户端,例如etcdctl、etcd proxy、fleetctl、docker客户端
  • server certificate: 服务端使用,客户端以此验证服务端身份,例如docker服务端、kube-apiserver
  • peer certificate: 双向证书,用于etcd集群成员间通信

三、创建CA证书

1、生成默认CA配置

mkdir /opt/ssl
cd /opt/ssl
cfssl print-defaults config > ca-config.json
cfssl print-defaults csr > ca-csr.json

修改ca-config.json,分别配置针对三种不同证书类型的profile,其中有效期43800h为5年

{
    "signing": {
        "default": {
            "expiry": "43800h"
        },
        "profiles": {
            "server": {
                "expiry": "43800h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth"
                ]
            },
            "client": {
                "expiry": "43800h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "client auth"
                ]
            },
            "peer": {
                "expiry": "43800h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}

修改ca-csr.config

{
    "CN": "Self Signed Ca",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "SH",
            "O": "Netease",
            "ST": "SH",            
            "OU": "OT"
        }    ]
}

生成CA证书和私钥

cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
生成ca.pem、ca.csr、ca-key.pem(CA私钥,需妥善保管)

2、签发Server Certificate

cfssl print-defaults csr > server.json
vim server.json
{
    "CN": "Server",
    "hosts": [
        "192.168.1.1"
       ],
    "key": {
        "algo": "ecdsa",
        "size": 256
    },
    "names": [
        {
            "C": "CN",
            "L": "SH",
            "ST": "SH"
        }
    ]
}
生成服务端证书和私钥
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server.json | cfssljson -bare server

3、签发Client Certificate

cfssl print-defaults csr > client.json
vim client.json
{
    "CN": "Client",
    "hosts": [],
    "key": {
        "algo": "ecdsa",
        "size": 256
    },
    "names": [
        {
            "C": "CN",
            "L": "SH",
            "ST": "SH"
        }
    ]
}
生成客户端证书和私钥
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client.json | cfssljson -bare client

4、签发peer certificate

cfssl print-defaults csr > member1.json
vim member1.json
{
    "CN": "member1",
    "hosts": [
        "192.168.1.1"
    ],
    "key": {
        "algo": "ecdsa",
        "size": 256
    },
    "names": [
        {
            "C": "CN",
            "L": "SH",
            "ST": "SH"
        }
    ]
}
为节点member1生成证书和私钥:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer member1.json | cfssljson -bare member1
针对etcd服务,每个etcd节点上按照上述方法生成相应的证书和私钥

5、最后校验证书

校验生成的证书是否和配置相符

openssl x509 -in ca.pem -text -noout
openssl x509 -in server.pem -text -noout
openssl x509 -in client.pem -text -noout

四、k8s集群所需证书

未分类