搭建rtmp服务器

安装web环境

安装阿里云web环境一键安装包
安装前需要注意要把数据盘挂载到alidata目录上。

下载nginx-rtmp-moudle

这里下载 ,上传解压到home目录,

重新生成nginx

修改/home/sh-1.4.4/nginx/install_nginx-1.4.4.sh,在–prefix=/alidata/server/nginx \下行增加

--add-module=/home/nginx-rtmp-module-master

然后执行/install_nginx-1.4.4.sh,重新编译生成nginx文件。

停止当前nginx,用上一步生成的文件替换。

/alidata/server/nginx-1.4.4/sbin/nginx

配置rtmp应用服务

在nginx.conf中和http块同级别增加rtmp块,如下:

rtmp_auto_push on;
rtmp {
server {
listen 1935;
chunk_size 4000;

application rtmp1 {
live on;
#allow play all;
#play /home;
}
application hls1 {
live on;
hls on;
hls_path /tmp/hls;
}
}
}

针对hls,在http里面增加一个location配置

location /hls {  
            types {  
                application/vnd.apple.mpegurl m3u8;  
                video/mp2t ts;  
            }  
            root /tmp;  
            add_header Cache-Control no-cache;  
}

重新启动nginx

安装ffmpeg

svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg
./configure --disable-yasm
make
sudo chmod 777 /usr/local/
make install 

测试推流

 ffmpeg -re -i /home/mm.MOV -vcodec copy -acodec copy -f flv rtmp://****:1935/myapp/test
 ffmpeg -re -i /home/test.264 -vcodec copy -f flv rtmp://****:1935/myapp/test
 ffmpeg -re -i /home/my.flv -f flv rtmp://****:1935/myapp/test

 

查看文档和播放示例

nginx-rtmp-module-master下的doc、test分别提供了文档说明向导和示例,示例使用了jwplayer flash播放rtmp。
再配置一个http vhost,root指向

root /home/nginx-rtmp-module-master/test/www;

修改指向目录中的index.html文件中的file后的内容为自己发布视频的地址,然后可以访问 http://****/index.html 播放视频。

HTTPS

HTTPS基本的作用是使信息传输过程安全。
使用HTTPS可以避免 ISP 劫持,例如站点可能会被移动运营商劫持注入话费充值广告。
HTTPS 证书分为3类: 1. DV 域名验证证书 2. OV 组织机构验证证书 3. EV 增强的组织机构验证证书。每类证书在审核和验证方面要求严格程度不同,浏览器会在地址栏给予不同证书不一样的展现。一般个人可以使用DV证书,浏览器表现为地址栏前会有绿色的小锁。

免费的证书

1.StartSSL 的免费证书有效期是1年,1年后需要手动更换。配置过程还挺麻烦的。并且可能已经遭到了 Mozilla 封杀。
2.Let’s Encrypt,虽然有效期只有3个月,但可以用 certbot 自动化工具自动续期。
3.阿里云免费型DV SSL,管理控制台/安全/SSL证书,证书类型选择阿里云免费型DV SSL……,只能申请一个普通域名证书,即非通配域名证书,需要填写手机号接收电话询问。
4.其它证书厂商 https://www.myssl.cn/

生成https证书

 
 $ cd /alidata/server/nginx/conf
 $ openssl genrsa -des3 -out wwkssl.key 1024
 $ openssl req -new -key wwkssl.key -out wwkssl.csr
 $ cp wwkssl.key wwkssl.key.org
 $ openssl rsa -in wwkssl.key.org -out wwkssl.key
 $ openssl x509 -req -days 3650 -in wwkssl.csr -signkey wwkssl.key -out wwkssl.crt

Let’s Encrypt CertBot https证书

为了加快 https 的普及, EEF 电子前哨基金会、 Mozilla 基金会和美国密歇根大学成立了一个公益组织叫 ISRG ( Internet Security Research Group ),从 2015 年开始推出了 Let’s Encrypt 免费安全证书计划。后来又有思科(全球网络设备制造商执牛耳者)、 Akamai 加入,甚至连 Linux 基金会也加入了合作,这些大牌组织的加入保证了这个项目的可信度和可持续性。
certbot 是自动化工具,配置管理起来非常容易。

参考
https://certbot.eff.org/
https://certbot.eff.org/docs/using.html
手把手教你在Nginx上使用CertBot
https://segmentfault.com/a/1190000005797776
Linux CentOS 7 下 Nginx 安装使用 Let’ s Encrypt 证书的完整过程
http://blog.csdn.net/andylau00j/article/details/54604415
用 Certbot 一键升级你的网站为 Https
https://www.v2ex.com/t/383032
Let’s Encrypt 给网站加 HTTPS 完全指南certbot
http://blog.csdn.net/cstopery/article/details/51911298
使用certbot为你的网站免费上https
http://www.jianshu.com/p/fb3733cd0d3b

其中

yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
提示:Loaded plugins: fastestmirror, langpacks
#fastestmirror是yum的一个加速插件,简单处理办法就是禁用这个插件
vi  /etc/yum/pluginconf.d/fastestmirror.conf   
* enabled=0  //把1改为0  
vi /etc/yum.conf
plugins=1                 #将plugins的值修改为0
再次
yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
#生成证书:在我的txy服务器上,先停止nginx,然后执行下面的命令:
certbot certonly --standalone --email 'brogrammer@qq.com' -d 'www.brogrammer.cn' -d 'brogrammer.cn'
#或重新生成证书 
certbot renew

ubuntu上安装https证书过程:

lsb_release -a 查看ubuntu版本
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot 

解除 Problem binding to port 80 问题,先停止占用80端口。
service nginx stop
sudo certbot certonly --standalone -d go.sportscv.cn

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/go.sportscv.cn/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/go.sportscv.cn/privkey.pem
   Your cert will expire on 2018-08-08. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

service nginx start

生成keystore.p12
openssl pkcs12 -export -in fullchain.pem  -inkey privkey.pem  -out keystore.p12  -name tomcat  -CAfile chain.pem  -caname root

生成通配证书

certbot certonly --preferred-challenges dns --manual -d *.brogrammer.cn --server https://acme-v02.api.letsencrypt.org/directory
然后根据提示在域名解析网站上添加或修改DNS TXT记录值,可能需要等待10分钟生效后,继续执行。
成功后的打印结果如下:
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/brogrammer.cn/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/brogrammer.cn/privkey.pem
   Your cert will expire on 2019-02-01. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

https://www.jianshu.com/p/1eb7060c5ede

Spring Boot Secured By Let’s Encrypt

Spring Boot Application Secured by Let’s Encrypt Certificate


https://dzone.com/articles/spring-boot-secured-by-lets-encrypt

前端身份验证

前端身份验证功能依靠后端,根据不同形式的前端,有不同的策略:
单页应用可以内部控制授权;
多页应用可以通过http_auth_request模块验证授权;
http://www.cnblogs.com/hao-dotnet/p/3477442.html

centos中升级pyOpenSSL
sudo python -m easy_install –upgrade pyOpenSSL

腾讯云 DNSPod API 申请 Let’s Encrypt 泛域名证书

1、在服务器上安装相关环境依赖。
yum update -y && yum -y install curl cron socat
2、在服务器上下载安装 acme.sh 脚本。
curl https://get.acme.sh | sh
3.腾讯云服务器上可能只能使用其自己的dns,所以把要申请免费证书的域名接入到DNSPod,并使用DNSPod的NS服务器进行解析。
在域名注册管理平台修改dns为dnspod的dns地址:f1g1ns1.dnspod.net,f1g1ns2.dnspod.net。
4.登录https://www.dnspod.cn/console/dns,
在域名解析中添加域名,例如 brogrammer.cn,然后进一步添加主机解析记录。
在用户中心/安全设置中添加API Token。
5.在服务器上执行
export DP_Id=ID
export DP_Key=Token
.acme.sh/acme.sh –issue –dns dns_dp -d 域名 -d *.域名
如果成功的话,脚本会出现自动等待 120 秒来验证信息。签发成功后,就会给出 CSR、KEY、CERT 保存的路径 /root/.acme.sh/域名/。
6.将证书托管到腾讯云。在腾讯云上搜索SSL证书管理,点击上传证书,将前面生成的 xxx.cer 的内容填到证书栏,将 xxx.key 的内容填到私钥栏,点击上传。

7.在nginx配置文件中配置ssl。

server{
ssl_certificate /root/.acme.sh/xxx.cn/xxx.cn.cer;
ssl_certificate_key /root/.acme.sh/xxx.cn/xxx.cn.key;
}

当网站内有仍http请求存在时,Chrome浏览器会在地址栏前显示图标为灰色叹号,点击提示 您与此网站之间建立的连接并非完全安全。

GET和POST在浏览器上不同的表现

GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST没有。
GET只接受ASCII字符类型参数,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
GET产生一个TCP数据包,POST产生两个TCP数据包。
关于最后一条,详情参考 https://blog.csdn.net/happy_xiahuixiax/article/details/72859762

部署LNMP

试用了一个月阿里云服务器,服务真不错,安装布署教程也很全,但最终我也没有积累够耐心和时间做域名备案。换一个香港的vps吧,付款后立即给了ip和密码,但没有任何预装布署和指导,没有布署经验,现搜索网上的资源又太繁杂,何不试试阿里云那套安装流程呢?

参考 阿里云服务器linux操作指南

挂载数据盘

  • 登录服务器,可以使用SecureCRT
  • 检查磁盘分区,fdisk -l
  • 对磁盘分区,用fdisk命令创建主分区
  • 格式化磁盘,mkfs .ext3 /dev/xvdb1
  • 挂载数据盘

注意,根据后面安装包的需要,挂载数据盘需要挂载到根目录下的alidata,挂载命令如下:

mount /dev/xvdb1 /alidata/
df -hp

配置开机自动挂载

vi /etc/fstab
增加或修改为 /dev/vdb1 /alidata ext3 defaults 0 0

下载安装包

下载安装包 点击这里 ,并上传到服务器的/home目录下,解压。

安装

……

http://vodcdn.video.taobao.com/player/ugc/tb_ugc_pieces_core_player_loader.swf?version=1.0.20140324&vid=10251583&uid=c3Vubnlfbmljb2xlODI%3D&p=1&t=1&rid=http%3A%2F%2Fhelp.aliyun.com%2Fview%2F11108189_13495138.html%3Fspm%3D5176.7224445.1997283057.9.MnP1Di&random=6666

修改了vhosts,rewrite目录中的文件后,要重启nginx才生效。

./nginx -s reload
service nginx reload
在centos7中 sudo systemctl restart nginx

LNMP一键安装包
https://lnmp.org/

centos7安装并配置nginx+php
https://www.cnblogs.com/cglWorkBook/p/5431571.html

nginx配置

指令块

http{
  server{
    location / {
    }
  }
}

http块:可以嵌套多个server块。
location块:配置请求的路由,以及各种页面的处理情况。

rewrite 与 location

rewrite和location功能有点像,都能实现跳转。
区别:
rewrite是在同一域名内更改获取资源的路径,实现url重写和重定向,rewrite可放在server{},location{},if{}中。
location是对一类路径做控制访问或反向代理,location放在server{}中。
proxy_pass起到反向代理的作用,proxy_pass放在location{}中。

Nginx服务器中的重定向配置参考指南
http://www.link588.com/html/wangluobiancheng/139613.html

负载均衡

示例:

http{
upstream backend1{
ip_hash;
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=1;
}

server{
listen 80;
location / {
proxy_pass http://backend1;
}
}
}

nginx反向代理默认会轮询后台应用,每一个请求按顺序逐一分配到不同的后端服务器,如果后端服务器down掉了,则能自动剔除。
增加配置ip_hash标志后每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。
weight用来设置权重,用于后端服务器性能不均的情况,访问比率约等于权重之比。

代理配置

前端服务中配置反向代理,请求被传递到代理地址。
配置文件位于:/usr/local/nginx/conf/vhost

server{
    listen 80;
    listen 443 ssl;

        #ssl_certificate /usr/local/nginx/conf/wwkssl.crt;
        #ssl_certificate_key /usr/local/nginx/conf/wwkssl.key;
        ssl_certificate /etc/letsencrypt/live/www.
xxx.cn/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/www.xxx.cn/privkey.pem;

        server_name xxx.cn www.xxx.cn;

 #nginx 对文档检测比较严格,所以if  ( $host != 'www.csdn.com'  ) 这些代码之间需要有空格隔开,不然会报错:unknown directive “if($host!=”
 if ( $host != 'www.xxx.cn' )
 {
   rewrite ^/(.*)$http://www.xxx.cn/$1 permanent;
 }

        #proxy_set_header X-Forwarded-Host $host;
        #proxy_set_header X-Forwarded-Server $host;
        #proxy_set_header X-Real-IP $remote_addr;
        #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #proxy_set_header Host $host:$server_port;

        location / {
                proxy_pass https://代理地址:444;
                #以下头参数,请理解后设置。
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP       $remote_addr;
                proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

        if ($server_port = 80) {
                return 497;
        }

        #让http请求重定向到https请求
        #https://$host$uri?$args;
        error_page 497 https://$host$uri;
 }

在被代理服务器中配置如下:

server {
        listen 80;
        listen 444 ssl;
        #当同端口多域名时,server_name要配置为具体域名
        server_name localhost;
        index index.html index.htm index.php;
        root /xxx/www/xxx;

        ssl_certificate /xxx/server/nginx/conf/wwkssl.crt;
        ssl_certificate_key /xxx/server/nginx/conf/wwkssl.key;

        location ~ .*\.(php|php5)?$
        {
                #fastcgi_pass  unix:/tmp/php-cgi.sock;
                fastcgi_pass  127.0.0.1:9000;
                fastcgi_index index.php;
                include fastcgi.conf;
        }
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
                expires 30d;
        }
        location ~ .*\.(js|css)?$
        {
                expires 1h;
        }
       
        include /xxx/server/nginx/conf/rewrite/wordpress.conf;
        access_log  /xxx/log/nginx/access/xxx.log;
}

proxy_set_header指令

proxy_set_header指令允许重新定义或者添加发往后端服务器的请求头。
语法:proxy_set_header field value;
当前配置级别中没有定义proxy_set_header指令时,会从上级别继承配置。上级别可以是http, server, location。
默认情况下,只有两个请求头会被重新定义:
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;

几个value举例:
$host 是nginx代理服务器,即转发服务器
$proxy_host 是被转发服务器
$proxy_port 是被转发服务器的端口

几个field举例:
Host是请求的主机名
X-Real-IP是请求的真实IP
X-Forwarded-For表示请求是由谁发起的。

nginx优化

nginx优化突破十万并发
https://www.cnblogs.com/zhangrumingbj/p/3887693.html

location之proxy_pass

location后的路径都形如 /proxy/,proxy_pass后面的路径最后若加/表示绝对根路径,若不加/表示相对路径,把匹配的路径部分也给代理走。

假设下面四种情况都使用用 http://192.168.1.1/proxy/test.html 访问。

第一种:
location /proxy/ {
    proxy_pass http://127.0.0.1/;
}
结果代理到 http://127.0.0.1/test.html

第二种
location /proxy/ {
    proxy_pass http://127.0.0.1;
}
结果代理到 http://127.0.0.1/proxy/test.html

第三种:
location /proxy/ {
    proxy_pass http://127.0.0.1/aaa/;
}
结果代理到 http://127.0.0.1/aaa/test.html

第四种,这一种的如下结果待验证。
location /proxy/ {
    proxy_pass http://127.0.0.1/aaa;
}
结果代理到 http://127.0.0.1/aaatest.html

Spring boot 项目容器化

1.在pom.xml中增加使用docker-maven-plugin,Spring Boot Maven plugin 提供了很多方便的功能,包括:
收集的类路径上所有 jar 文件,并构建成一个单一的、可运行的jar。
搜索 public static void main() 方法来标记为可运行的类。

<properties>
    <docker.image.prefix>wwk</docker.image.prefix>
</properties>
<build> 
<plugins> 
<plugin> 
<groupId>com.spotify</groupId> 
<artifactId>docker-maven-plugin</artifactId> 
<configuration> 
<imageName>${docker.image.prefix}/${project.artifactId}</imageName> 
<dockerDirectory>src/main/docker</dockerDirectory> 
<resources> 
<resource> 
<targetPath>/</targetPath> 
<directory>${project.build.directory}</directory> 
<include>${project.build.finalName}.jar</include> 
</resource> 
</resources> 
</configuration> 
</plugin> 
</plugins> 
</build>

imageName指定镜像的名字。
dockerDirectory指定 Dockerfile文件 的位置。
resources是指那些需要和 Dockerfile 放在一起,在构建镜像时使用的文件。

构建镜像有两种方式,第一种是将构建信息指定到 POM 中,第二种是使用 Dockerfile 配置构建信息。
2.编写Dockerfile
Docker 使用 Dockerfile 文件格式来指定 image 层。
创建文件 src/main/docker/Dockerfile:

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD test-docker-1.0.0.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

3.执行构建和运行镜像

mvn package docker:build
docker run -p 8080:8080 -t wwk/test-docker

[INFO] Copying /Users/hycx/i_workspace/test/test-docker/target/test-docker-0.0.1-SNAPSHOT.jar -> /Users/hycx/i_workspace/test/test-docker/target/docker/test-docker-0.0.1-SNAPSHOT.jar
[INFO] Copying src/main/docker/Dockerfile -> /Users/hycx/i_workspace/test/test-docker/target/docker/Dockerfile
[INFO] Building image wwk/test-docker

4.
手动上传Dockerfile和jar文件到服务器,到同目录下,运行下面的命令,生成镜像。

docker build -t wwk/test-docker .
docker images

用 Docker 构建、运行、发布来一个 Spring Boot 应用
https://blog.csdn.net/kkkloveyou/article/details/50942275

Alpine Linux

frolvlad/alpine-oraclejdk8:slim 镜像的基础镜像是 Alpine Linux 3.7。
Alpine Linux 是一个社区开发的面向安全应用的轻量级 Linux 发行版。Alpine采用了musl libc和busybox以减小系统的体积和运行时资源消耗,在保持瘦身的同时,Alpine Linux还提供了自己的包管理工具apk,可以在其网站上查询,或者直接通过apk命令查询和安装。
Alpine Linux作为基础镜像只有5MB。

Spring boot 与 docker

Springboot服务本质上是一个java服务,它也可以同时在jar中打包一个Web服务器例如tomcat。java服务运行所依赖的就是java虚拟机,java虚拟机在大多数操作系统上都会安装。而spring boot服务可以打包为一个可执行的jar,可以很简单的运行管理。这样,一般地在已经安装了java运行环境的服务器上,把spring boot服务运行于docker内的必要性就不大了。

docker-php

测试docker下nginx + php-fpm

部署配置文件
/alidata/docker_work/nginx/下
conf目录中存放nginx-vhost配置文件
ssl目录中存放ssl证书
www目录中存放html和php文件

nginx-vhost配置文件,其中/host会在启动时被映射到主系统/alidata/docker_work/nginx/目录,php-fpm-alias是容器php-fpm1的别名,也可以使用php-fpm1的地址。

server {
        listen 80;
        listen 443 ssl;

        #server_name localhost;
        server_name  www.
xxx.cn;

        ssl_certificate /host/ssl/wwkssl.crt;
        ssl_certificate_key /host/ssl/wwkssl.key;

        index index.html index.htm index.php;

        #root /alidata/docker_work/nginx/www;
        root /host/www/brogrammer;

        location ~ .*\.(php|php5)?$
        {
                #fastcgi_pass  unix:/tmp/php-cgi.sock;
                fastcgi_pass  php-fpm-alias:9000;
                fastcgi_index index.php;
                #include fastcgi.conf;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                #fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        }
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
                expires 30d;
        }
        location ~ .*\.(js|css)?$
        {
                expires 1h;
        }

        #include /alidata/server/nginx/conf/rewrite/default.conf;
        #access_log  /alidata/log/nginx/access/default.log;
}

启动服务

#启动php-fpm。一定要加上项目文件目录映射,否则访问web页面会报File not found。
docker run --name php-fpm1 -v /alidata/docker_work/nginx/www:/host/www -d bitnami/php-fpm

#启动nginx。其中会link上php-fpm1。
docker run --name nginx1 -p 81:80 -p 444:443 --link php-fpm1:php-fpm-alias -v /alidata/docker_work/nginx/conf:/etc/nginx/conf.d -v /alidata/docker_work/nginx:/host -d nginx

破解Docker初学者的迷惑,多容器配合实现开发环境(nginx、php、memcached、mysql)
http://www.arkulo.com/2015/04/25/dockerlnmp/

kubernetes

k8s是容器集群管理系统。

Kubernetes将一个集群中的机器划分为一个Master节点和一群工作节点(Node)。其中,Master节点上运行着集群管理相关的一组进程etcd、API Server、Controller Manager、Scheduler,后三个组件构成了Kubernetes的总控中心,这些进程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理功能,并且全都是自动完成。在每个Node上运行Kubelet、Proxy、Docker daemon三个组件,负责对本节点上的Pod的生命周期进行管理,以及实现服务代理的功能。

https://www.cnblogs.com/menkeyi/p/7134460.html
https://www.jianshu.com/p/63ffc2214788

在Kubernetes中,Node、Pod、Replication Controller、Service等概念都可以看作一种资源对象,通过Kubernetes提供的Kubectl工具或者API调用进行操作,并保存在etcd中。

k8s的Node

Node:主机节点,一个node就是一台pc服务器或一个虚拟机,它是Kubernetes集群中相对于Master而言的工作主机,在较早的版本中也被称为Minion。Node可以是一台物理主机,也可以是一台虚拟机(VM)。在每个Node上运行用于启动和管理P
od的服务Kubelet,并能够被Master管理。在Node上运行的服务进程包括Kubelet、kube-proxy和docker daemon。

Node信息有:
Node地址,即主机的IP地址,或者Node ID。
Node运行状态:包括Pending、Running、Terminated三种状态。
Node Condition(条件):描述Running状态Node的运行条件,目前只有一种条件—-Ready。Ready表示Node处于健康状态,可以接收从Master发来的创建Pod的指令。
Node系统容量:描述Node可用的系统资源,包括CPU、内存数量、最大可调度Pod数量等。
其他:Node的其他信息,包括实例的内核版本号、Kubernetes版本号、Docker版本号、操作系统名称等。

Node的管理
Node通常是物理机、虚拟机或者云服务商提供的资源,并不是由Kubernetes创建的。我们说Kubernetes创建一个Node,仅仅表示Kubernetes在系统内部创建了一个Node对象,创建后即会对其进行一系列健康检查,包括是否可以连通、服务是否正确启动、是否可以创建Pod等。如果检查未能通过,则该Node将会在集群中被标记为不可用(Not Ready)。

1. 使用Node Controller对Node进行管理
Node Controller是Kubernetes Master中的一个组件,用于管理Node对象。它的两个主要功能包括:集群范围内的Node信息同步,以及单个Node的生命周期管理。
Node信息同步可以通过kube-controller-manager的启动参数–node-sync-period设置同步的时间周期。

2. Node的自注册
当Kubelet的–register-node参数被设置为true(默认值即为true)时,Kubelet会向apiserver注册自己。这也是Kubernetes推荐的Node管理方式。

3. 手动管理Node
Kubernetes集群管理员也可以手工创建和修改Node对象。当需要这样操作时,先要将Kubelet启动参数中的–register-node参数的值设置为false。这样,在Node上的Kubelet就不会把自己注册到apiserver中去了。

4.另外,Kubernetes提供了一种运行时加入或者隔离某些Node的方法。

Label

Label以key/value键值对的形式附加到各种对象上,如Pod、Service、RC、Node等。Label定义了这些对象的可识别属性,用来对它们进行管理和选择。
在为对象定义好Label后,其他对象就可以使用Label Selector(选择器)来定义其作用的对象了。

Replication Controller(RC)

Replication Controller用于定义Pod副本的数量。在Master内,Controller Manager进程通过RC的定义来完成Pod的创建、监控、启停等操作。

Pod

Pod:k8s最小单位,包含多个容器,当有两个程序必须相互依赖,可以使用一个pod管理。
Pod是Kubernetes的最基本操作单元,包含一个活多个紧密相关的容器,一个Pod中的多个容器应用通常是紧耦合的。Pod在Node上被创建、启动或者销毁。
一个Pod可以被一个容器化的环境看作应用层的“逻辑宿主机”(Logical Host)。
为什么Kubernetes使用Pod在容器之上再封装一层呢?一个很重要的原因是,Docker容器之间的通信受到Docker网络机制的限制。在Docker的世界中,一个容器需要link方式才能访问另一个容器提供的服务(端口)。大量容器之间的link将是一个非常繁重的工作。通过Pod的概念将多个容器组合在一个虚拟的“主机”内,可以实现容器之间仅需要通过Localhost就能相互通信了。

一个Pod中的应用容器共享同一组资源,如下所述:
PID命名空间:Pod中的不同应用程序可以看到其他应用程序的进程ID;
网络命名空间:Pod中的多个容器能够访问同一个IP和端口范围;
IPC命名空间:Pod中的多个容器能够使用SystemV IPC或者POSIX消息队列进行通信;
UTS命名空间:Pod中的多个容器共享一个主机名;
Volumes(共享存储卷):Pod中的各个容器可以访问在Pod级别定义的Volumes。

Pod的生命周期是通过Replication Controller来管理的。Pod的生命周期过程包括:通过模板进行定义,然后分配到一个Node上运行,在Pod所含容器运行结束后Pod也结束。

Kubernetes为Pod设计了一套独特的网络配置,包括:为每个Pod分配一个IP地址,使用Pod名作为容器间通信的主机名等。
另外,不建议在Kubernetes的一个Pod内运行相同应用的多个实例。

Service

Service:集群内部的Pod访问方式,通过service名字可以访问到pod里面包含的应用。
每个Pod都会被分配一个单独的IP地址,但这个IP地址会随时Pod的销毁而消失。这就引出一个问题:如果有一组Pod组成一个集群来提供服务,那么如何来访问它们?
Kubernetes的Service(服务)就是用来解决这个问题的核心概念。
一个Service可以看作一组提供相同服务的Pod的对外访问接口。Service作用于哪些Pod是通过Label Selector来定义的。

Volume(存储卷)

Volume是Pod中能够被多个容器访问的共享目录。Kubernetes的Volume概念与Docker的Volume比较类似,但不完全相同。Kubernetes中的Volume与Pod生命周期相同,但与容器的生命周期不相关。当容器终止或者重启时,Volume中的数据也不会丢失。另外,Kubernetes支持多种类型的Volume,并且一个Pod可以同时使用任意多个Volume。
存储:pv和pvc,pod可以通过pvc挂载外部的存储,将应用程序产生的数据或配置文件存储起来

Namespace(命名空间)

通过将系统内部的对象“分配”到不同的Namespace中,形成逻辑上分组的不同项目、小组或用户组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。
Kubernetes集群在启动后,会创建一个名为“default”的Namespace,通过Kubectl可以查看到。
使用Namespace来组织Kubernetes的各种对象,可以实现对用户的分组,即“多租户”管理。对不同的租户还可以进行单独的资源配额设置和管理,使得整个集群的资源配置非常灵活、方便。
Namespaces:命名空间,用于一个集群内,系统的隔离。

Annotation(注解)

Annotation与Label类似,也使用key/value键值对的形式进行定义。Label具有严格的命名规则,它定义的是Kubernetes对象的元数据(Metadata),并且用于Label Selector。Annotation则是用户任意定义的“附加”信息,以便于外部工具进行查找。

spring cloud与K8S

微服务有六个基本必须实现:1.进程通讯2.服务注册与发现3.负债均衡4.配置中心5.熔断器6.网关路由。

k8s和spring cloud 的出发点不同,一个是基于容器管理的概念,一个是基于程序的注册与发现(我个人认为Netflix 的核心在于注册中心)。二者都可以达到我们的目的。就拿实现一个高可用的注册中心Eureka 来说,单纯从Netflix的设计思想来说,eureka 是一个AP 系统,要保证数据的同步,可以采用注册中心(Eureka server )相互注册的方案,实现一个集群,但是集群每加入一个节点,要更新所有的client的配置。常规的思想,我们可以通过负载均衡的轮询算法实现,然而这个思路正是k8s 的出发点。可能Spring Cloud +K8s二者皆用是一个最好的方案,但是二者择其一一样可以达到目的。

https://blog.csdn.net/educast/article/details/78328981

https://blog.csdn.net/qq_32971807/article/details/56489609