<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Agones – Agones Documentation</title>
    <link>/site/docs/</link>
    <description>Recent content in Agones Documentation on Agones</description>
    <generator>Hugo -- gohugo.io</generator>
    
	  <atom:link href="/site/docs/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Docs: Feature Stages</title>
      <link>/site/docs/guides/feature-stages/</link>
      <pubDate>Thu, 26 Sep 2019 01:20:41 +0000</pubDate>
      
      <guid>/site/docs/guides/feature-stages/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;supported-versions&#34;&gt;Supported Versions&lt;/h2&gt;

&lt;p&gt;Agones versions are expressed as x.y.z, where x is the major version, y is the minor version, and z is the patch version
, following &lt;a href=&#34;http://semver.org/&#34;&gt;Semantic Versioning&lt;/a&gt; terminology.&lt;/p&gt;

&lt;h2 id=&#34;agones-features&#34;&gt;Agones Features&lt;/h2&gt;

&lt;p&gt;A feature within Agones can be in &lt;code&gt;Alpha&lt;/code&gt;, &lt;code&gt;Beta&lt;/code&gt; or &lt;code&gt;Stable&lt;/code&gt; stage.&lt;/p&gt;

&lt;h2 id=&#34;feature-gates&#34;&gt;Feature Gates&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Alpha&lt;/code&gt; and &lt;code&gt;Beta&lt;/code&gt; features can be enabled or disabled through the &lt;code&gt;agones.featureGates&lt;/code&gt; configuration option
that can be found in the &lt;a href=&#34;/site/site/docs/installation/install-agones/helm/#configuration&#34;&gt;Helm configuration&lt;/a&gt; documentation.&lt;/p&gt;

&lt;p&gt;The current set of &lt;code&gt;alpha&lt;/code&gt; and &lt;code&gt;beta&lt;/code&gt; feature gates are:&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature Name&lt;/th&gt;
&lt;th&gt;Gate&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Since&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Multicluster Allocation&lt;sup&gt;*&lt;/sup&gt;&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Enabled&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Beta&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1.6.0&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;Example Gate (not in use)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Example&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Disabled&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;0.13.0&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;/site/site/docs/reference/gameserver/&#34;&gt;Port Allocations to Multiple Containers&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ContainerPortAllocation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enabled&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Beta&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1.7.0&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;/site/site/docs/guides/player-tracking/&#34;&gt;Player Tracking&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;PlayerTracking&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Disabled&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Alpha&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1.6.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;sup&gt;*&lt;/sup&gt;Multicluster Allocation was started before this process was in place, and therefore does not have a
 feature gate and cannot be disabled.&lt;/p&gt;

&lt;h2 id=&#34;description-of-stages&#34;&gt;Description of Stages&lt;/h2&gt;

&lt;h3 id=&#34;alpha&#34;&gt;Alpha&lt;/h3&gt;

&lt;p&gt;An &lt;code&gt;Alpha&lt;/code&gt; feature means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Disabled by default.&lt;/li&gt;
&lt;li&gt;Might be buggy. Enabling the feature may expose bugs.&lt;/li&gt;
&lt;li&gt;Support for this feature may be dropped at any time without notice.&lt;/li&gt;
&lt;li&gt;The API may change in incompatible ways in a later software release without notice.&lt;/li&gt;
&lt;li&gt;Recommended for use only in short-lived testing clusters, due to increased risk of bugs and lack of long-term support.&lt;/li&gt;
&lt;/ul&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
Please do try &lt;code&gt;Alpha&lt;/code&gt; features and give feedback on them. This is important to ensure less breaking changes
through the &lt;code&gt;Beta&lt;/code&gt; period.
&lt;/div&gt;


&lt;h3 id=&#34;beta&#34;&gt;Beta&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;Beta&lt;/code&gt; feature means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enabled by default, but able to be disabled through a feature gate.&lt;/li&gt;
&lt;li&gt;The feature is well tested. Enabling the feature is considered safe.&lt;/li&gt;
&lt;li&gt;Support for the overall feature will not be dropped, though details may change.&lt;/li&gt;
&lt;li&gt;The schema and/or semantics of objects may change in incompatible ways in a subsequent beta or stable releases. When
this happens, we will provide instructions for migrating to the next version. This may require deleting, editing,
and re-creating API objects. The editing process may require some thought. This may require downtime for
applications that rely on the feature.&lt;/li&gt;
&lt;li&gt;Recommended for only non-business-critical uses because of potential for incompatible changes in subsequent releases.
If you have multiple clusters that can be upgraded independently, you may be able to relax this restriction.&lt;/li&gt;
&lt;/ul&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
Note: Please do try &lt;code&gt;Beta&lt;/code&gt; features and give feedback on them! After they exit beta, it may not be practical for us
to make more changes.
&lt;/div&gt;


&lt;h3 id=&#34;stable&#34;&gt;Stable&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;Stable&lt;/code&gt; feature means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The feature is enabled and the corresponding feature gate no longer exists.&lt;/li&gt;
&lt;li&gt;Stable versions of features will appear in released software for many subsequent versions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;feature-stage-indicators&#34;&gt;Feature Stage Indicators&lt;/h2&gt;

&lt;p&gt;There are a variety of features with Agones, how can we determine what stage each feature is in?&lt;/p&gt;

&lt;p&gt;Below are indicators for each type of functionality that can be used to determine the feature stage for a given aspect
of Agones.&lt;/p&gt;

&lt;h3 id=&#34;custom-resource-definitions-crds&#34;&gt;Custom Resource Definitions (CRDs)&lt;/h3&gt;

&lt;p&gt;This refers to Kubernetes resource for Agones, such as &lt;code&gt;GameServer&lt;/code&gt;, &lt;code&gt;Fleet&lt;/code&gt; and &lt;code&gt;GameServerAllocation&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&#34;new-crds&#34;&gt;New CRDs&lt;/h4&gt;

&lt;p&gt;For new resources, the stage of the resource will be indicated by the &lt;code&gt;apiVersion&lt;/code&gt; of the resource.&lt;/p&gt;

&lt;p&gt;For example: &lt;code&gt;apiVersion: &amp;quot;agones.dev/v1&amp;quot;&lt;/code&gt; is a &lt;code&gt;stable&lt;/code&gt; resource, &lt;code&gt;apiVersion: &amp;quot;agones.dev/v1beta1&amp;quot;&lt;/code&gt; is a &lt;code&gt;beta&lt;/code&gt;
 stage resource, and &lt;code&gt;apiVersion: &amp;quot;agones.dev/v1alpha1&amp;quot;&lt;/code&gt; is an &lt;code&gt;alpha&lt;/code&gt; stage resource.&lt;/p&gt;

&lt;h4 id=&#34;new-crd-attributes&#34;&gt;New CRD attributes&lt;/h4&gt;

&lt;p&gt;When &lt;code&gt;alpha&lt;/code&gt; and &lt;code&gt;beta&lt;/code&gt; attributes are added to an existing stable Agones CRD, we will follow the Kubernetes &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api_changes.md#adding-unstable-features-to-stable-versions&#34;&gt;&lt;em&gt;Adding
 Unstable Features to Stable Versions&lt;/em&gt;&lt;/a&gt;
Guide to optimise on the least amount of breaking changes for users as attributes progress through feature stages.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;alpha&lt;/code&gt; and &lt;code&gt;beta&lt;/code&gt; attributes will be added to the existing CRD as &lt;code&gt;optional&lt;/code&gt; and documented with their feature stage.
Attempting to populate these &lt;code&gt;alpha&lt;/code&gt; and &lt;code&gt;beta&lt;/code&gt; attributes on an Agones CRD will return a validation error if their
 accompanying Feature Flag is not enabled.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;alpha&lt;/code&gt; and &lt;code&gt;beta&lt;/code&gt; attributes can be subject to change of name and structure, and will result in breaking changes
 before moving to a &lt;code&gt;stable&lt;/code&gt; stage. These changes will be outlined in release notes and feature documentation.&lt;/p&gt;

&lt;h3 id=&#34;agones-game-server-sdk&#34;&gt;Agones Game Server SDK&lt;/h3&gt;

&lt;p&gt;Any &lt;code&gt;alpha&lt;/code&gt; or &lt;code&gt;beta&lt;/code&gt; Game Server SDK functionality will be a subpackage of the &lt;code&gt;sdk&lt;/code&gt; package. For example
, functionality found in a &lt;code&gt;sdk.alphav1&lt;/code&gt; package should be considered at the &lt;code&gt;alpha&lt;/code&gt; feature stage.&lt;/p&gt;

&lt;p&gt;Only experimental functionality will be found in any &lt;code&gt;alpha&lt;/code&gt; and &lt;code&gt;beta&lt;/code&gt; SDK packages, and as such may change as
development occurs.&lt;/p&gt;

&lt;p&gt;As SDK features move to through feature stages towards &lt;code&gt;stable&lt;/code&gt;, the previous version of the SDK API
will remain for at least one release to enable easy migration to the more stable feature stage (i.e. from &lt;code&gt;alpha
&lt;/code&gt; -&amp;gt; &lt;code&gt;beta&lt;/code&gt;, &lt;code&gt;beta&lt;/code&gt; -&amp;gt; &lt;code&gt;stable&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;Any other SDK functionality not marked as &lt;code&gt;alpha&lt;/code&gt; or &lt;code&gt;beta&lt;/code&gt; is assumed to be &lt;code&gt;stable&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&#34;rest-grpc-apis&#34;&gt;REST &amp;amp; gRPC APIs&lt;/h3&gt;

&lt;p&gt;REST and gRPC API will have versioned paths where appropriate to indicate their feature stage.&lt;/p&gt;

&lt;p&gt;For example, a REST API with a prefix of &lt;code&gt;v1alpha1&lt;/code&gt; is an &lt;code&gt;alpha&lt;/code&gt; stage feature:
&lt;code&gt;http://api.example.com/v1alpha1/exampleaction&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Similar to the SDK, any &lt;code&gt;alpha&lt;/code&gt; or &lt;code&gt;beta&lt;/code&gt; gRPC functionality will be a subpackage of the main API package.
For example, functionality found in a &lt;code&gt;api.alphav1&lt;/code&gt; package should be considered at the &lt;code&gt;alpha&lt;/code&gt; feature stage.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Unreal Engine Game Server Client Plugin</title>
      <link>/site/docs/guides/client-sdks/unreal/</link>
      <pubDate>Thu, 13 Jun 2019 10:17:50 +0000</pubDate>
      
      <guid>/site/docs/guides/client-sdks/unreal/</guid>
      <description>
        
        
        



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
The Unreal SDK is functional, but not yet feature complete.
&lt;a href=&#34;https://github.com/googleforgames/agones/pulls&#34;&gt;Pull requests&lt;/a&gt; to finish the functionality are appreciated.
&lt;/div&gt;


&lt;p&gt;Check the &lt;a href=&#34;/site/site/docs/guides/client-sdks/&#34;&gt;Client SDK Documentation&lt;/a&gt; for more details on each of the SDK functions and how to run the SDK locally.&lt;/p&gt;

&lt;h2 id=&#34;download&#34;&gt;Download&lt;/h2&gt;

&lt;p&gt;Download the source from the &lt;a href=&#34;https://github.com/googleforgames/agones/releases&#34;&gt;Releases Page&lt;/a&gt;
or 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/sdks/unreal&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;directly from GitHub&lt;/a&gt;
.&lt;/p&gt;

&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;

&lt;p&gt;The Unreal Engine plugin is specifically designed to be as simple as possible. No programming should be required to use the plugin within your Unreal Engine project.&lt;/p&gt;

&lt;h3 id=&#34;from-source&#34;&gt;From source&lt;/h3&gt;

&lt;p&gt;At this moment we do not provide binaries for the plugin. This requires you to compile the plugin yourself. In order to do this you need to have a C++ Unreal Engine project.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a &lt;code&gt;Plugins&lt;/code&gt; directory in your Unreal Engine project root directory.&lt;/li&gt;
&lt;li&gt;Copy 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/sdks/unreal&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;the Agones plugin directory&lt;/a&gt;
 into the Plugins directory.&lt;/li&gt;
&lt;li&gt;Build the project.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&#34;agones-hook&#34;&gt;Agones Hook&lt;/h3&gt;

&lt;p&gt;To manually call the Agones SDK methods add the plugin as a dependency inside the &lt;code&gt;&amp;lt;project&amp;gt;.Build.cs&lt;/code&gt; file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;PublicDependencyModuleNames.AddRange(
    new string[]
    {
        ...
        &amp;quot;Agones&amp;quot;
    });
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then use &lt;code&gt;FAgonesModule::GetHook()&lt;/code&gt; to get a reference to the Agones hook and call the SDK methods using the hook:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#include &amp;quot;Agones.h&amp;quot;

...

// Get a reference to the Agones hook.
FAgonesHook&amp;amp; Hook = FAgonesModule::GetHook();

Hook.Ready();
Hook.SetLabel(TEXT(&amp;quot;key&amp;quot;), TEXT(&amp;quot;value&amp;quot;));

// GetGameServerDelegate here is a class member of type FGameServerRequestCompleteDelegate.
Hook.GetGameServer(GetGameServerDelegate);
GetGameServerDelegate.BindLambda([](TSharedPtr&amp;lt;FGameServer&amp;gt; GameServer, bool bSuccess)
{
    // ...
});
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;settings&#34;&gt;Settings&lt;/h2&gt;

&lt;p&gt;The settings for the Agones Plugin can be found in the Unreal Engine editor &lt;code&gt;Edit &amp;gt; Project Settings &amp;gt; Plugins &amp;gt;  Agones&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Available settings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Health Ping Enabled. Whether the server sends a health ping to the Agones sidecar. (default: &lt;code&gt;true&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Health Ping Seconds. Interval of the server sending a health ping to the Agones sidecar. (default: &lt;code&gt;5&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Request Retry Limit. Maximum number of times a failed request to the Agones sidecar is retried. Health requests are not retried. (default: &lt;code&gt;30&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Send Ready at Startup. Automatically send a Ready request when the server starts. Disable this to manually control when the game server should be marked as ready. (default: &lt;code&gt;true&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Third Party Videos and Presentations</title>
      <link>/site/docs/third-party-content/videos-and-presentations/</link>
      <pubDate>Thu, 03 Jan 2019 08:37:35 +0000</pubDate>
      
      <guid>/site/docs/third-party-content/videos-and-presentations/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;presentations&#34;&gt;Presentations&lt;/h2&gt;

&lt;h3 id=&#34;large-scale-multiplayer-gaming-on-kubernetes-cloud-next-19&#34;&gt;Large-Scale Multiplayer Gaming on Kubernetes (Cloud Next &amp;lsquo;19)&lt;/h3&gt;

&lt;iframe width=&#34;640&#34; height=&#34;360&#34; class=&#34;p-2&#34; src=&#34;https://www.youtube.com/embed/Imf_urBB7SI&#34;
        frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;


&lt;h3 id=&#34;agones-scaling-multiplayer-game-servers-with-open-source-gdc-2019&#34;&gt;Agones: Scaling Multiplayer Game Servers with Open Source (GDC 2019)&lt;/h3&gt;

&lt;iframe width=&#34;640&#34; height=&#34;360&#34; class=&#34;p-2&#34; src=&#34;https://www.youtube.com/embed/XD1nuASFY3k&#34;
        frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;


&lt;h3 id=&#34;intro-to-agones-scaling-multiplayer-game-servers-with-kubernetes-kubecon-2018&#34;&gt;Intro to Agones: Scaling Multiplayer Game Servers with Kubernetes (Kubecon, 2018)&lt;/h3&gt;

&lt;iframe width=&#34;640&#34; height=&#34;360&#34; class=&#34;p-2&#34; src=&#34;https://www.youtube.com/embed/Q4RZSHTeKCY&#34;
        frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;


&lt;h3 id=&#34;google-cloud-next-18-london-carl-dionne-development-director-at-ubisoft-montreal&#34;&gt;Google Cloud Next &amp;lsquo;18 London: Carl Dionne, Development Director at Ubisoft Montreal&lt;/h3&gt;

&lt;iframe width=&#34;640&#34; height=&#34;360&#34; class=&#34;p-2&#34; src=&#34;https://www.youtube.com/embed/5n-JlLA7bIc?start=835&#34;
        frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;


&lt;h3 id=&#34;agones-scaling-multiplayer-dedicated-game-servers-with-kubernetes-cloud-next-18&#34;&gt;Agones: Scaling Multiplayer Dedicated Game Servers with Kubernetes (Cloud Next &amp;lsquo;18)&lt;/h3&gt;

&lt;iframe width=&#34;640&#34; height=&#34;360&#34; class=&#34;p-2&#34; src=&#34;https://www.youtube.com/embed/CLNpkjolxYA&#34;
        frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;


&lt;h2 id=&#34;screencasts&#34;&gt;Screencasts&lt;/h2&gt;

&lt;h3 id=&#34;agones-how-do-i-docker-and-kubernetes-part-1-part-2&#34;&gt;Agones: How Do I Docker and Kubernetes? (Part 1 &amp;amp; Part 2)&lt;/h3&gt;

&lt;p&gt;&lt;iframe width=&#34;640&#34; height=&#34;360&#34; class=&#34;p-2&#34; src=&#34;https://www.youtube.com/embed/i4_zaztK6mE&#34;
        frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;

&lt;iframe width=&#34;640&#34; height=&#34;360&#34; class=&#34;p-2&#34; src=&#34;https://www.youtube.com/embed/ZZXLDnmO1TM&#34;
        frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Scheduling and Autoscaling</title>
      <link>/site/docs/advanced/scheduling-and-autoscaling/</link>
      <pubDate>Thu, 03 Jan 2019 05:45:05 +0000</pubDate>
      
      <guid>/site/docs/advanced/scheduling-and-autoscaling/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;cluster-autoscaler&#34;&gt;Cluster Autoscaler&lt;/h2&gt;

&lt;p&gt;Kubernetes has a &lt;a href=&#34;https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler&#34;&gt;cluster node autoscaler that works with a wide variety of cloud providers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The default scheduling strategy (&lt;code&gt;Packed&lt;/code&gt;) is designed to work with the Kubernetes autoscaler out of the box.&lt;/p&gt;

&lt;p&gt;The autoscaler will automatically add Nodes to the cluster when &lt;code&gt;GameServers&lt;/code&gt; don&amp;rsquo;t have room to be scheduled on the
clusters, and then scale down when there are empty Nodes with no &lt;code&gt;GameServers&lt;/code&gt; running on them.&lt;/p&gt;

&lt;p&gt;This means that scaling &lt;code&gt;Fleets&lt;/code&gt; up and down can be used to control the size of the cluster, as the cluster autoscaler
will adjust the size of the cluster to match the resource needs of one or more &lt;code&gt;Fleets&lt;/code&gt; running on it.&lt;/p&gt;

&lt;p&gt;To enable and configure autoscaling on your cloud provider, check their &lt;a href=&#34;https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler/cloudprovider&#34;&gt;connector implementation&lt;/a&gt;,
or their cloud specific documentation.&lt;/p&gt;

&lt;h3 id=&#34;google-kubernetes-engine&#34;&gt;Google Kubernetes Engine&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-autoscaler&#34;&gt;Administering Clusters: Autoscaling a Cluster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-autoscaler&#34;&gt;Cluster Autoscaler&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;azure-kubernetes-service&#34;&gt;Azure Kubernetes Service&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.microsoft.com/en-us/azure/aks/autoscaler&#34;&gt;Cluster Autoscaler on Azure Kubernetes Service (AKS) - Preview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;fleet-autoscaling&#34;&gt;Fleet Autoscaling&lt;/h2&gt;

&lt;p&gt;Fleet autoscaling is the only type of autoscaling that exists in Agones. It is currently available as a
buffer autoscaling strategy or as a webhook driven strategy, such that you can provide your own autoscaling logic.&lt;/p&gt;

&lt;p&gt;Have a look at the &lt;a href=&#34;/site/site/docs/getting-started/create-fleetautoscaler/&#34;&gt;Create a Fleet Autoscaler&lt;/a&gt; quickstart, the
&lt;a href=&#34;/site/site/docs/getting-started/create-webhook-fleetautoscaler/&#34;&gt;Create a Webhook Fleet Autoscaler&lt;/a&gt; quickstart,
and the &lt;a href=&#34;/site/site/docs/reference/fleetautoscaler/&#34;&gt;Fleet Autoscaler Specification&lt;/a&gt; for details.&lt;/p&gt;

&lt;h2 id=&#34;autoscaling-concepts&#34;&gt;Autoscaling Concepts&lt;/h2&gt;

&lt;p&gt;To facilitate autoscaling, we need to combine several concepts and functionality, as described below.&lt;/p&gt;

&lt;h3 id=&#34;allocation-scheduling&#34;&gt;Allocation Scheduling&lt;/h3&gt;

&lt;p&gt;Allocation scheduling refers to the order in which &lt;code&gt;GameServers&lt;/code&gt;, and specifically their backing &lt;code&gt;Pods&lt;/code&gt; are chosen
from across the Kubernetes cluster within a given &lt;code&gt;Fleet&lt;/code&gt; when &lt;a href=&#34;/site/site/docs/getting-started/create-fleet/#4-allocate-a-game-server-from-the-fleet&#34;&gt;allocation&lt;/a&gt; occurs.&lt;/p&gt;

&lt;h3 id=&#34;pod-scheduling&#34;&gt;Pod Scheduling&lt;/h3&gt;

&lt;p&gt;Each &lt;code&gt;GameServer&lt;/code&gt; is backed by a Kubernetes &lt;a href=&#34;https://kubernetes.io/docs/concepts/workloads/pods/pod/&#34;&gt;&lt;code&gt;Pod&lt;/code&gt;&lt;/a&gt;. Pod scheduling
refers to the strategy that is in place that determines which node in the Kubernetes cluster the Pod is assigned to,
when it is created.&lt;/p&gt;

&lt;h3 id=&#34;fleet-scale-down-strategy&#34;&gt;Fleet Scale Down Strategy&lt;/h3&gt;

&lt;p&gt;Fleet Scale Down strategy refers to the order in which the &lt;code&gt;GameServers&lt;/code&gt; that belong to a &lt;code&gt;Fleet&lt;/code&gt; are deleted,
when Fleets are shrunk in size.&lt;/p&gt;

&lt;h2 id=&#34;fleet-scheduling&#34;&gt;Fleet Scheduling&lt;/h2&gt;

&lt;p&gt;There are two scheduling strategies for Fleets - each designed for different types of Kubernetes Environments.&lt;/p&gt;

&lt;h3 id=&#34;packed&#34;&gt;Packed&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;apiVersion&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones.dev/v1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;kind&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;Fleet&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;metadata&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;simple-udp&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;replicas&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;scheduling&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;Packed&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;template&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;ports&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;containerPort&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;7654&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;template&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;          &lt;/span&gt;containers&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;          &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;simple-udp&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;            &lt;/span&gt;image&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;gcr.io/agones-images/udp-server&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0.21&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is the &lt;em&gt;default&lt;/em&gt; Fleet scheduling strategy. It is designed for dynamic Kubernetes environments, wherein you wish
to scale up and down as load increases or decreases, such as in a Cloud environment where you are paying
for the infrastructure you use.&lt;/p&gt;

&lt;p&gt;It attempts to &lt;em&gt;pack&lt;/em&gt; as much as possible into the smallest set of nodes, to make
scaling infrastructure down as easy as possible.&lt;/p&gt;

&lt;p&gt;This affects the Cluster autoscaler, Allocation Scheduling, Pod Scheduling and Fleet Scale Down Scheduling.&lt;/p&gt;

&lt;h4 id=&#34;cluster-autoscaler-1&#34;&gt;Cluster Autoscaler&lt;/h4&gt;

&lt;p&gt;To ensure that the Cluster Autoscaler doesn&amp;rsquo;t attempt to evict and move &lt;code&gt;GameServer&lt;/code&gt; &lt;code&gt;Pods&lt;/code&gt; onto new Nodes during
gameplay, Agones adds the annotation &lt;a href=&#34;https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#what-types-of-pods-can-prevent-ca-from-removing-a-node&#34;&gt;&lt;code&gt;&amp;quot;cluster-autoscaler.kubernetes.io/safe-to-evict&amp;quot;: &amp;quot;false&amp;quot;&lt;/code&gt;&lt;/a&gt;
to the backing Pod.&lt;/p&gt;

&lt;h4 id=&#34;allocation-scheduling-strategy&#34;&gt;Allocation Scheduling Strategy&lt;/h4&gt;

&lt;p&gt;Under the &amp;ldquo;Packed&amp;rdquo; strategy, allocation will prioritise allocating &lt;code&gt;GameServers&lt;/code&gt; to nodes that are running on
Nodes that already have allocated &lt;code&gt;GameServers&lt;/code&gt; running on them.&lt;/p&gt;

&lt;h4 id=&#34;pod-scheduling-strategy&#34;&gt;Pod Scheduling Strategy&lt;/h4&gt;

&lt;p&gt;Under the &amp;ldquo;Packed&amp;rdquo; strategy, Pods will be scheduled using the &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#inter-pod-affinity-and-anti-affinity-beta-feature&#34;&gt;&lt;code&gt;PodAffinity&lt;/code&gt;&lt;/a&gt;
with a &lt;code&gt;preferredDuringSchedulingIgnoredDuringExecution&lt;/code&gt; affinity with &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#interlude-built-in-node-labels&#34;&gt;hostname&lt;/a&gt;
topology. This attempts to group together &lt;code&gt;GameServer&lt;/code&gt; Pods within as few nodes in the cluster as it can.&lt;/p&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
The default Kubernetes scheduler doesn&amp;rsquo;t do a perfect job of packing, but it&amp;rsquo;s a good enough job for what we need -
  at least at this stage.
&lt;/div&gt;


&lt;h4 id=&#34;fleet-scale-down-strategy-1&#34;&gt;Fleet Scale Down Strategy&lt;/h4&gt;

&lt;p&gt;With the &amp;ldquo;Packed&amp;rdquo; strategy, Fleets will remove &lt;code&gt;Ready&lt;/code&gt; &lt;code&gt;GameServers&lt;/code&gt; from Nodes with the &lt;em&gt;least&lt;/em&gt; number of &lt;code&gt;Ready&lt;/code&gt; and
&lt;code&gt;Allocated&lt;/code&gt; &lt;code&gt;GameServers&lt;/code&gt; on them. Attempting to empty Nodes so that they can be safely removed.&lt;/p&gt;

&lt;h3 id=&#34;distributed&#34;&gt;Distributed&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;apiVersion&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones.dev/v1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;kind&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;Fleet&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;metadata&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;simple-udp&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;replicas&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;scheduling&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;Distributed&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;template&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;ports&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;containerPort&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;7654&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;template&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;          &lt;/span&gt;containers&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;          &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;simple-udp&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;            &lt;/span&gt;image&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;gcr.io/agones-images/udp-server&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0.21&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This Fleet scheduling strategy is designed for static Kubernetes environments, such as when you are running Kubernetes
on bare metal, and the cluster size rarely changes, if at all.&lt;/p&gt;

&lt;p&gt;This attempts to distribute the load across the entire cluster as much as possible, to take advantage of the static
size of the cluster.&lt;/p&gt;

&lt;p&gt;This affects Allocation Scheduling, Pod Scheduling and Fleet Scale Down Scheduling.&lt;/p&gt;

&lt;h4 id=&#34;cluster-autoscaler-2&#34;&gt;Cluster Autoscaler&lt;/h4&gt;

&lt;p&gt;Since this strategy is not aimed at clusters that autoscale, this strategy does nothing for the cluster autoscaler.&lt;/p&gt;

&lt;h4 id=&#34;allocation-scheduling-strategy-1&#34;&gt;Allocation Scheduling Strategy&lt;/h4&gt;

&lt;p&gt;Under the &amp;ldquo;Distributed&amp;rdquo; strategy, allocation will prioritise allocating &lt;code&gt;GameServers&lt;/code&gt; to nodes that have the least
number of allocated &lt;code&gt;GameServers&lt;/code&gt; on them.&lt;/p&gt;

&lt;h4 id=&#34;pod-scheduling-strategy-1&#34;&gt;Pod Scheduling Strategy&lt;/h4&gt;

&lt;p&gt;Under the &amp;ldquo;Distributed&amp;rdquo; strategy, &lt;code&gt;Pod&lt;/code&gt; scheduling is provided by the default Kubernetes scheduler, which will attempt
to distribute the &lt;code&gt;GameServer&lt;/code&gt; &lt;code&gt;Pods&lt;/code&gt; across as many nodes as possible.&lt;/p&gt;

&lt;h4 id=&#34;fleet-scale-down-strategy-2&#34;&gt;Fleet Scale Down Strategy&lt;/h4&gt;

&lt;p&gt;With the &amp;ldquo;Distributed&amp;rdquo; strategy, Fleets will remove &lt;code&gt;Ready&lt;/code&gt; &lt;code&gt;GameServers&lt;/code&gt; from Nodes with at random, to ensure
a distributed load is maintained.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: GameServer Specification</title>
      <link>/site/docs/reference/gameserver/</link>
      <pubDate>Thu, 03 Jan 2019 03:58:48 +0000</pubDate>
      
      <guid>/site/docs/reference/gameserver/</guid>
      <description>
        
        
        

&lt;p&gt;A full GameServer specification is available below and in the 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/gameserver.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;example folder&lt;/a&gt;
 for reference :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;apiVersion&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones.dev/v1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;kind&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;GameServer&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# GameServer Metadata&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# https://v1-15.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.15/#objectmeta-v1-meta&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;metadata&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# generateName: &amp;#34;gds-example&amp;#34; # generate a unique name, with the given prefix&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;gds-example&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# set a fixed name&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# if there is more than one container, specify which one is the game server&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;container&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;example-server&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Array of ports that can be exposed as direct connections to the game server container&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;ports&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# name is a descriptive name for the port&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;default&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# portPolicy has three options:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# - &amp;#34;Dynamic&amp;#34; (default) the system allocates a free hostPort for the gameserver, for game clients to connect to&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# - &amp;#34;Static&amp;#34;, user defines the hostPort that the game client will connect to. Then onus is on the user to ensure that the&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# port is available. When static is the policy specified, `hostPort` is required to be populated&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# - &amp;#34;Passthrough&amp;#34; dynamically sets the `containerPort` to the same value as the dynamically selected hostPort.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#      This will mean that users will need to lookup what port has been opened through the server side SDK.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;portPolicy&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;Static&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# [Stage:Beta]&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# [FeatureFlag:ContainerPortAllocation]&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# The name of the container to open the port on. Defaults to the game server container if omitted or empty.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;container&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;simple-udp&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# the port that is being opened on the game server process&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;containerPort&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;7654&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# the port exposed on the host, only required when `portPolicy` is &amp;#34;Static&amp;#34;. Overwritten when portPolicy is &amp;#34;Dynamic&amp;#34;.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;hostPort&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;7777&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# protocol being used. Defaults to UDP. TCP is the only other option&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;protocol&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;UDP&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Health checking for the running game server&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;health&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Disable health checking. defaults to false, but can be set to true&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;disabled&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Number of seconds after the container has started before health check is initiated. Defaults to 5 seconds&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;initialDelaySeconds&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# If the `Health()` function doesn&amp;#39;t get called at least once every period (seconds), then&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# the game server is not healthy. Defaults to 5&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;periodSeconds&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Minimum consecutive failures for the health probe to be considered failed after having succeeded.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Defaults to 3. Minimum value is 1&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;failureThreshold&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Parameters for game server sidecar&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;sdkServer&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# sdkServer log level parameter has three options:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#  - &amp;#34;Info&amp;#34; (default) The SDK server will output all messages except for debug messages&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#  - &amp;#34;Debug&amp;#34; The SDK server will output all messages including debug messages&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#  - &amp;#34;Error&amp;#34; The SDK server will only output error messages&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;logLevel&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;Info&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# grpcPort and httpPort control what ports the sdkserver listens on.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Starting with Agones 1.2 the default grpcPort is 9357 and the default&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# httpPort is 9358. In earlier releases, the defaults were 59357 and 59358&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# respectively but as these were in the ephemeral port range they could&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# conflict with other TCP connections.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;grpcPort&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;9357&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;httpPort&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;9358&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# [Stage:Alpha]&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# [FeatureFlag:PlayerTracking]&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Players provides the configuration for player tracking features.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Commented out since Alpha, and disabled by default&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# players:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#   # set this GameServer&amp;#39;s initial player capacity&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#   initialCapacity: 10&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Pod template configuration&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# https://v1-15.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.15/#podtemplate-v1-core&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;template&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# pod metadata. Name &amp;amp; Namespace is overwritten&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;metadata&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;labels&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;myspeciallabel&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;myspecialvalue&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Pod Specification&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;containers&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;simple-udp&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;image&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;gcr.io/agones-images/udp-server&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0.21&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;imagePullPolicy&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;Always&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Since Agones defines a new &lt;a href=&#34;https://kubernetes.io/docs/concepts/api-extension/custom-resources/&#34;&gt;Custom Resources Definition (CRD)&lt;/a&gt; we can define a new resource using the kind &lt;code&gt;GameServer&lt;/code&gt; with the custom group &lt;code&gt;agones.dev&lt;/code&gt; and API version &lt;code&gt;v1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can use the metadata field to target a specific &lt;a href=&#34;https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/&#34;&gt;namespaces&lt;/a&gt;
but also attach specific &lt;a href=&#34;https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/&#34;&gt;annotations&lt;/a&gt; and &lt;a href=&#34;https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/&#34;&gt;labels&lt;/a&gt; to your resource. This is a very common pattern in the Kubernetes ecosystem.&lt;/p&gt;

&lt;p&gt;The length of the &lt;code&gt;name&lt;/code&gt; field of the Gameserver should not exceed 63 characters.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;spec&lt;/code&gt; field is the actual GameServer specification and it is composed as follow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;container&lt;/code&gt; is the name of container running the GameServer in case you have more than one container defined in the &lt;a href=&#34;https://kubernetes.io/docs/concepts/workloads/pods/pod-overview/&#34;&gt;pod&lt;/a&gt;. If you do,  this is a mandatory field. For instance this is useful if you want to run a sidecar to ship logs.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ports&lt;/code&gt; are an array of ports that can be exposed as direct connections to the game server container

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt; is an optional descriptive name for a port&lt;/li&gt;
&lt;li&gt;&lt;code&gt;portPolicy&lt;/code&gt; has three options:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Dynamic&lt;/code&gt; (default) the system allocates a random free hostPort for the gameserver, for game clients to connect to.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Static&lt;/code&gt;, user defines the hostPort that the game client will connect to. Then onus is on the user to ensure that the port is available. When static is the policy specified, &lt;code&gt;hostPort&lt;/code&gt; is required to be populated.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Passthrough&lt;/code&gt; dynamically sets the &lt;code&gt;containerPort&lt;/code&gt;  to the same value as the dynamically selected hostPort. This will mean that users will need to lookup what port to open through the server side SDK before starting communications.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;container&lt;/code&gt; (Alpha) the name of the container to open the port on. Defaults to the game server container if omitted or empty.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;containerPort&lt;/code&gt; the port that is being opened on the game server process, this is a required field for &lt;code&gt;Dynamic&lt;/code&gt; and &lt;code&gt;Static&lt;/code&gt; port policies, and should not be included in &lt;code&gt;Passthrough&lt;/code&gt; configuration.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;protocol&lt;/code&gt; the protocol being used. Defaults to UDP. TCP is the only other option.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;health&lt;/code&gt; to track the overall healthy state of the GameServer, more information available in the &lt;a href=&#34;/site/site/docs/guides/health-checking/&#34;&gt;health check documentation&lt;/a&gt;.
-&lt;code&gt;sdkServer&lt;/code&gt; defines parameters for the game server sidecar

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;logging&lt;/code&gt; field defines log level for SDK server. Defaults to &amp;ldquo;Info&amp;rdquo;. It has three options:&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Info&amp;rdquo; (default) The SDK server will output all messages except for debug messages&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Debug&amp;rdquo; The SDK server will output all messages including debug messages&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Error&amp;rdquo; The SDK server will only output error messages&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grpcPort&lt;/code&gt; the port that the SDK Server binds to for gRPC connections&lt;/li&gt;
&lt;li&gt;&lt;code&gt;httpPort&lt;/code&gt; the port that the SDK Server binds to for HTTP gRPC gateway connections&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;players&lt;/code&gt; (Alpha, behind &amp;ldquo;PlayerTracking&amp;rdquo; feature gate), sets this GameServer&amp;rsquo;s initial player capacity&lt;/li&gt;
&lt;li&gt;&lt;code&gt;template&lt;/code&gt; the &lt;a href=&#34;https://v1-15.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.15/#podtemplatespec-v1-core&#34;&gt;pod spec template&lt;/a&gt; to run your GameServer containers, &lt;a href=&#34;https://kubernetes.io/docs/concepts/workloads/pods/pod-overview/#pod-templates&#34;&gt;see&lt;/a&gt; for more information.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;gameserver-state-diagram&#34;&gt;GameServer State Diagram&lt;/h2&gt;

&lt;p&gt;The following diagram shows the lifecycle of a &lt;code&gt;GameServer&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Game Servers are created through Kubernetes API (either directly or through a &lt;a href=&#34;/site/site/docs/reference/fleet/&#34;&gt;Fleet&lt;/a&gt;) and their state transitions are orchestrated by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GameServer controller, which allocates ports, launches Pods backing game servers and manages their lifetime&lt;/li&gt;
&lt;li&gt;Allocation controller, which marks game servers as &lt;code&gt;Allocated&lt;/code&gt; to handle a game session&lt;/li&gt;
&lt;li&gt;SDK, which manages health checking and shutdown of a game server session&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&#34;../../../diagrams/gameserver-states.dot.png&#34; alt=&#34;GameServer State Diagram&#34; /&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Quickstart: Create a Game Server</title>
      <link>/site/docs/getting-started/create-gameserver/</link>
      <pubDate>Wed, 02 Jan 2019 06:35:31 +0000</pubDate>
      
      <guid>/site/docs/getting-started/create-gameserver/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;objectives&#34;&gt;Objectives&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create a GameServer in Kubernetes using Agones custom resource.&lt;/li&gt;
&lt;li&gt;Get information about the GameServer such as IP address, port and state.&lt;/li&gt;
&lt;li&gt;Connect to the GameServer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;

&lt;p&gt;The following prerequisites are required to create a GameServer :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A Kubernetes cluster with the UDP port range 7000-8000 open on each node.&lt;/li&gt;
&lt;li&gt;Agones controller installed in the targeted cluster&lt;/li&gt;
&lt;li&gt;kubectl properly configured&lt;/li&gt;
&lt;li&gt;Netcat which is already installed on most Linux/macOS distributions, for windows you can use &lt;a href=&#34;https://docs.microsoft.com/en-us/windows/wsl/install-win10&#34;&gt;WSL&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you don&amp;rsquo;t have a Kubernetes cluster you can follow &lt;a href=&#34;/site/site/docs/installation/&#34;&gt;these instructions&lt;/a&gt; to create a cluster on Google Kubernetes Engine (GKE), Minikube or Azure Kubernetes Service (AKS), and install Agones.&lt;/p&gt;

&lt;p&gt;For the purpose of this guide we&amp;rsquo;re going to use the 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/simple-udp/&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;simple-udp&lt;/a&gt;
 example as the GameServer container. This example is a very simple UDP server written in Go. Don&amp;rsquo;t hesitate to look at the code of this example for more information.&lt;/p&gt;

&lt;h3 id=&#34;1-create-a-gameserver&#34;&gt;1. Create a GameServer&lt;/h3&gt;

&lt;p&gt;Let&amp;rsquo;s create a GameServer using the following command :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/simple-udp/gameserver.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You should see a successful output similar to this :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gameserver &amp;quot;simple-udp&amp;quot; created
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This has created a GameServer record inside Kubernetes, which has also created a backing &lt;a href=&#34;https://kubernetes.io/docs/concepts/workloads/pods/pod/&#34;&gt;Pod&lt;/a&gt; to run our simple udp game server code in.
If you want to see all your running GameServers you can run:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl get gameservers
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It should look something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NAME               STATE     ADDRESS       PORT   NODE     AGE
simple-udp-7pjrq   Ready   35.233.183.43   7190   agones   3m
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can also see the &lt;a href=&#34;https://kubernetes.io/docs/concepts/workloads/pods/pod/&#34;&gt;Pod&lt;/a&gt; that got created by running &lt;code&gt;kubectl get pods&lt;/code&gt;, the Pod will be prefixed by &lt;code&gt;simple-udp&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NAME                READY     STATUS    RESTARTS   AGE
simple-udp-7pjrq    2/2       Running   0          5m
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As you can see above it says &lt;code&gt;READY: 2/2&lt;/code&gt; this means there are two containers running in this Pod, this is because Agones injected the SDK sidecar for readiness and health checking of your Game Server.&lt;/p&gt;

&lt;p&gt;For the full details of the YAML file head to the &lt;a href=&#34;/site/site/docs/reference/gameserver/&#34;&gt;GameServer Specification Guide&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&#34;2-fetch-the-gameserver-status&#34;&gt;2. Fetch the GameServer Status&lt;/h3&gt;

&lt;p&gt;Let&amp;rsquo;s wait for the GameServer state to become &lt;code&gt;Ready&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;watch kubectl describe gameserver
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;Name:         simple-udp-7pjrq
Namespace:    default
Labels:       &amp;lt;none&amp;gt;
Annotations:  agones.dev/sdk-version: 0.9.0-764fa53
API Version:  agones.dev/v1
Kind:         GameServer
Metadata:
  Creation Timestamp:  2019-02-27T15:06:20Z
  Finalizers:
    agones.dev
  Generate Name:     simple-udp-
  Generation:        1
  Resource Version:  30377
  Self Link:         /apis/agones.dev/v1/namespaces/default/gameservers/simple-udp-7pjrq
  UID:               3d7ac3e1-3aa1-11e9-a4f5-42010a8a0019
Spec:
  Container:  simple-udp
  Health:
    Failure Threshold:      3
    Initial Delay Seconds:  5
    Period Seconds:         5
  Ports:
    Container Port:  7654
    Host Port:       7190
    Name:            default
    Port Policy:     Dynamic
    Protocol:        UDP
  Scheduling:        Packed
  Template:
    Metadata:
      Creation Timestamp:  &amp;lt;nil&amp;gt;
    Spec:
      Containers:
        Image:  gcr.io/agones-images/udp-server:0.21
        Name:   simple-udp
        Resources:
          Limits:
            Cpu:     20m
            Memory:  32Mi
          Requests:
            Cpu:     20m
            Memory:  32Mi
Status:
  Address:    35.233.183.43
  Node Name:  agones
  Ports:
    Name:  default
    Port:  7190
  State:   Ready
Events:
  Type    Reason          Age   From                   Message
  ----    ------          ----  ----                   -------
  Normal  PortAllocation  34s   gameserver-controller  Port allocated
  Normal  Creating        34s   gameserver-controller  Pod simple-udp-7pjrq created
  Normal  Scheduled       34s   gameserver-controller  Address and port populated
  Normal  Ready           27s   gameserver-controller  SDK.Ready() executed
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you look towards the bottom, you can see there is a &lt;code&gt;Status &amp;gt; State&lt;/code&gt; value. We are waiting for it to move to &lt;code&gt;Ready&lt;/code&gt;, which means that the game server is ready to accept connections.&lt;/p&gt;

&lt;p&gt;You might also be interested to see the &lt;code&gt;Events&lt;/code&gt; section, which outlines when various lifecycle events of the &lt;code&gt;GameServer&lt;/code&gt; occur. We can also see when the &lt;code&gt;GameServer&lt;/code&gt; is ready on the event stream as well - at which time the &lt;code&gt;Status &amp;gt; Address&lt;/code&gt; and &lt;code&gt;Status &amp;gt; Ports &amp;gt; Port&lt;/code&gt; have also been populated, letting us know what IP and port our client can now connect to!&lt;/p&gt;

&lt;p&gt;Let&amp;rsquo;s retrieve the IP address and the allocated port of your Game Server :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl get gs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This should output your Game Server IP address and ports, eg:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NAME               STATE   ADDRESS         PORT   NODE     AGE
simple-udp-7pjrq   Ready   35.233.183.43   7190   agones   4m
&lt;/code&gt;&lt;/pre&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
If you have Agones installed on minikube the address printed will not be
  reachable from the host machine. Instead, use the output of &lt;code&gt;minikube ip&lt;/code&gt; for
  the following section.
&lt;/div&gt;


&lt;h3 id=&#34;3-connect-to-the-gameserver&#34;&gt;3. Connect to the GameServer&lt;/h3&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
If you have Agones installed on Google Kubernetes Engine, and are using
  Cloud Shell for your terminal, UDP is blocked. For this step, we recommend
  SSH&amp;rsquo;ing into a running VM in your project, such as a Kubernetes node.
  You can click the &amp;lsquo;SSH&amp;rsquo; button on the &lt;a href=&#34;https://console.cloud.google.com/compute/instances&#34;&gt;Google Compute Engine Instances&lt;/a&gt;
  page to do this.
  Run &lt;code&gt;toolbox&lt;/code&gt; on GKE Node to run docker container with tools and then &lt;code&gt;nc&lt;/code&gt; command would be available.
&lt;/div&gt;


&lt;p&gt;You can now communicate with the Game Server :&lt;/p&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
If you do not have netcat installed
  (i.e. you get a response of &lt;code&gt;nc: command not found&lt;/code&gt;),
  you can install netcat by running &lt;code&gt;sudo apt install netcat&lt;/code&gt;.
&lt;/div&gt;


&lt;pre&gt;&lt;code&gt;nc -u {IP} {PORT}
Hello World !
ACK: Hello World !
EXIT
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can finally type &lt;code&gt;EXIT&lt;/code&gt; which tells the SDK to run the &lt;a href=&#34;/site/site/docs/guides/client-sdks/#shutdown&#34;&gt;Shutdown command&lt;/a&gt;, and therefore shuts down the &lt;code&gt;GameServer&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you run &lt;code&gt;kubectl describe gameserver&lt;/code&gt; again - either the GameServer will be gone completely, or it will be in &lt;code&gt;Shutdown&lt;/code&gt; state, on the way to being deleted.&lt;/p&gt;

&lt;h2 id=&#34;next-step&#34;&gt;Next Step&lt;/h2&gt;

&lt;p&gt;If you want to use your own GameServer container make sure you have properly integrated the &lt;a href=&#34;/site/site/docs/guides/client-sdks/&#34;&gt;Agones SDK&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Google Kubernetes Engine</title>
      <link>/site/docs/installation/creating-cluster/gke/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/site/docs/installation/creating-cluster/gke/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;/h2&gt;

&lt;p&gt;Take the following steps to enable the Kubernetes Engine API:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Visit the &lt;a href=&#34;https://console.cloud.google.com/kubernetes/list&#34;&gt;Kubernetes Engine&lt;/a&gt; page in the Google Cloud Platform Console.&lt;/li&gt;
&lt;li&gt;Create or select a project.&lt;/li&gt;
&lt;li&gt;Wait for the API and related services to be enabled. This can take several minutes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://support.google.com/cloud/answer/6293499#enable-billing&#34;&gt;Enable billing&lt;/a&gt; for your project.

&lt;ul&gt;
&lt;li&gt;If you are not an existing GCP user, you may be able to enroll for a $300 US &lt;a href=&#34;https://cloud.google.com/free/&#34;&gt;Free Trial&lt;/a&gt; credit.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&#34;choosing-a-shell&#34;&gt;Choosing a shell&lt;/h3&gt;

&lt;p&gt;To complete this quickstart, we can use either &lt;a href=&#34;https://cloud.google.com/shell/&#34;&gt;Google Cloud Shell&lt;/a&gt; or a local shell.&lt;/p&gt;

&lt;p&gt;Google Cloud Shell is a shell environment for managing resources hosted on Google Cloud Platform (GCP). Cloud Shell comes preinstalled with the &lt;a href=&#34;https://cloud.google.com/sdk/gcloud/&#34;&gt;gcloud&lt;/a&gt; and &lt;a href=&#34;https://kubernetes.io/docs/user-guide/kubectl-overview/&#34;&gt;kubectl&lt;/a&gt; command-line tools. &lt;code&gt;gcloud&lt;/code&gt; provides the primary command-line interface for GCP, and &lt;code&gt;kubectl&lt;/code&gt; provides the command-line interface for running commands against Kubernetes clusters.&lt;/p&gt;

&lt;p&gt;If you prefer using your local shell, you must install the gcloud and kubectl command-line tools in your environment.&lt;/p&gt;

&lt;h4 id=&#34;cloud-shell&#34;&gt;Cloud shell&lt;/h4&gt;

&lt;p&gt;To launch Cloud Shell, perform the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href=&#34;https://console.cloud.google.com/home/dashboard&#34;&gt;Google Cloud Platform Console&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;From the top-right corner of the console, click the
&lt;strong&gt;Activate Google Cloud Shell&lt;/strong&gt; button: &lt;img src=&#34;../../../../images/cloud-shell.png&#34; alt=&#34;cloud shell&#34; /&gt;&lt;/li&gt;
&lt;li&gt;A Cloud Shell session opens inside a frame at the bottom of the console. Use this shell to run &lt;code&gt;gcloud&lt;/code&gt; and &lt;code&gt;kubectl&lt;/code&gt; commands.&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Set a compute zone in your geographical region with the following command. The compute zone will be something like &lt;code&gt;us-west1-a&lt;/code&gt;. A full list can be found &lt;a href=&#34;https://cloud.google.com/compute/docs/regions-zones/#available&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;gcloud config &lt;span style=&#34;color:#204a87&#34;&gt;set&lt;/span&gt; compute/zone &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;COMPUTE_ZONE&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&#34;local-shell&#34;&gt;Local shell&lt;/h4&gt;

&lt;p&gt;To install &lt;code&gt;gcloud&lt;/code&gt; and &lt;code&gt;kubectl&lt;/code&gt;, perform the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://cloud.google.com/sdk/docs/quickstarts&#34;&gt;Install the Google Cloud SDK&lt;/a&gt;, which includes the &lt;code&gt;gcloud&lt;/code&gt; command-line tool.&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Initialize some default configuration by running the following command.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;When asked &lt;code&gt;Do you want to configure a default Compute Region and Zone? (Y/n)?&lt;/code&gt;, enter &lt;code&gt;Y&lt;/code&gt; and choose a zone in your geographical region of choice.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;gcloud init&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Install the &lt;code&gt;kubectl&lt;/code&gt; command-line tool by running the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;gcloud components install kubectl&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;creating-the-cluster&#34;&gt;Creating the cluster&lt;/h2&gt;

&lt;p&gt;A &lt;a href=&#34;https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-architecture&#34;&gt;cluster&lt;/a&gt; consists of at least one &lt;em&gt;cluster master&lt;/em&gt; machine and multiple worker machines called &lt;em&gt;nodes&lt;/em&gt;: &lt;a href=&#34;https://cloud.google.com/compute/docs/instances/&#34;&gt;Compute Engine virtual machine&lt;/a&gt; instances that run the Kubernetes processes necessary to make them part of the cluster.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;gcloud container clusters create &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;CLUSTER_NAME&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt; --cluster-version&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;.15 &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --tags&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;game-server &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --scopes&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;gke-default &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --num-nodes&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --no-enable-autoupgrade &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --machine-type&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;n1-standard-4&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Flag explanations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cluster-version: Agones requires Kubernetes version 1.15.&lt;/li&gt;
&lt;li&gt;tags: Defines the tags that will be attached to new nodes in the cluster. This is to grant access through ports via the firewall created in the next step.&lt;/li&gt;
&lt;li&gt;scopes: Defines the Oauth scopes required by the nodes.&lt;/li&gt;
&lt;li&gt;num-nodes: The number of nodes to be created in each of the cluster&amp;rsquo;s zones. Default: 4. Depending on the needs of your game, this parameter should be adjusted.&lt;/li&gt;
&lt;li&gt;no-enable-autoupgrade: Disable automatic upgrades for nodes to reduce the likelihood of in-use games being disrupted.&lt;/li&gt;
&lt;li&gt;machine-type: The type of machine to use for nodes. Default: n1-standard-4. Depending on the needs of your game, you may wish to &lt;a href=&#34;https://cloud.google.com/compute/docs/machine-types&#34;&gt;have smaller or larger machines&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Optional&lt;/em&gt;: Create a dedicated node pool for the Agones controllers. If you choose to skip this step, the Agones
controllers will share the default node pool with your game servers which is fine for kicking the tires but is not
recommended for a production deployment.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;gcloud container node-pools create agones-system &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --cluster&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=[&lt;/span&gt;CLUSTER_NAME&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --no-enable-autoupgrade &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --node-taints agones.dev/agones-system&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;true:NoExecute &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --node-labels agones.dev/agones-system&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;true&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --num-nodes&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Optional&lt;/em&gt;: Create a node pool for &lt;a href=&#34;/site/site/docs/guides/metrics/&#34;&gt;Metrics&lt;/a&gt; if you want to monitor the
 Agones system using Prometheus with Grafana or Stackdriver.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;gcloud container node-pools create agones-metrics &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --cluster&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=[&lt;/span&gt;CLUSTER_NAME&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --no-enable-autoupgrade &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --node-taints agones.dev/agones-metrics&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;true:NoExecute &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --node-labels agones.dev/agones-metrics&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;true&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --num-nodes&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Flag explanations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cluster: The name of the cluster in which the node pool is created.&lt;/li&gt;
&lt;li&gt;no-enable-autoupgrade: Disable automatic upgrades for nodes to reduce the likelihood of in-use games being disrupted.&lt;/li&gt;
&lt;li&gt;node-taints: The Kubernetes taints to automatically apply to nodes in this node pool.&lt;/li&gt;
&lt;li&gt;node-labels: The Kubernetes labels to automatically apply to nodes in this node pool.&lt;/li&gt;
&lt;li&gt;num-nodes: The Agones system controllers only require a single node of capacity to run. For faster recovery time in the event of a node failure, you can increase the size to 2.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, let&amp;rsquo;s tell &lt;code&gt;gcloud&lt;/code&gt; that we are speaking with this cluster, and get auth credentials for &lt;code&gt;kubectl&lt;/code&gt; to use.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;gcloud config &lt;span style=&#34;color:#204a87&#34;&gt;set&lt;/span&gt; container/cluster &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;CLUSTER_NAME&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt;
gcloud container clusters get-credentials &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;CLUSTER_NAME&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;creating-the-firewall&#34;&gt;Creating the firewall&lt;/h3&gt;

&lt;p&gt;We need a firewall to allow UDP traffic to nodes tagged as &lt;code&gt;game-server&lt;/code&gt; via ports 7000-8000.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;gcloud compute firewall-rules create game-server-firewall &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --allow udp:7000-8000 &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --target-tags game-server &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --description &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Firewall to allow game server udp traffic&amp;#34;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Continue to &lt;a href=&#34;/site/site/docs/installation/install-agones/&#34;&gt;Install Agones&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Installing Agones on Google Kubernetes Engine using Terraform</title>
      <link>/site/docs/installation/terraform/gke/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/site/docs/installation/terraform/gke/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;/h2&gt;

&lt;p&gt;Take the following steps to enable the Kubernetes Engine API:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Visit the &lt;a href=&#34;https://console.cloud.google.com/kubernetes/list&#34;&gt;Kubernetes Engine&lt;/a&gt; page in the Google Cloud Platform Console.&lt;/li&gt;
&lt;li&gt;Create or select a project.&lt;/li&gt;
&lt;li&gt;Wait for the API and related services to be enabled. This can take several minutes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://support.google.com/cloud/answer/6293499#enable-billing&#34;&gt;Enable billing&lt;/a&gt; for your project.

&lt;ul&gt;
&lt;li&gt;If you are not an existing GCP user, you may be able to enroll for a $300 US &lt;a href=&#34;https://cloud.google.com/free/&#34;&gt;Free Trial&lt;/a&gt; credit.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&#34;choosing-a-shell&#34;&gt;Choosing a shell&lt;/h3&gt;

&lt;p&gt;To complete this quickstart, we can use either &lt;a href=&#34;https://cloud.google.com/shell/&#34;&gt;Google Cloud Shell&lt;/a&gt; or a local shell.&lt;/p&gt;

&lt;p&gt;Google Cloud Shell is a shell environment for managing resources hosted on Google Cloud Platform (GCP). Cloud Shell comes preinstalled with the &lt;a href=&#34;https://cloud.google.com/sdk/gcloud/&#34;&gt;gcloud&lt;/a&gt; and &lt;a href=&#34;https://kubernetes.io/docs/user-guide/kubectl-overview/&#34;&gt;kubectl&lt;/a&gt; command-line tools. &lt;code&gt;gcloud&lt;/code&gt; provides the primary command-line interface for GCP, and &lt;code&gt;kubectl&lt;/code&gt; provides the command-line interface for running commands against Kubernetes clusters.&lt;/p&gt;

&lt;p&gt;If you prefer using your local shell, you must install the gcloud and kubectl command-line tools in your environment.&lt;/p&gt;

&lt;h4 id=&#34;cloud-shell&#34;&gt;Cloud shell&lt;/h4&gt;

&lt;p&gt;To launch Cloud Shell, perform the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href=&#34;https://console.cloud.google.com/home/dashboard&#34;&gt;Google Cloud Platform Console&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;From the top-right corner of the console, click the
&lt;strong&gt;Activate Google Cloud Shell&lt;/strong&gt; button: &lt;img src=&#34;../../../../images/cloud-shell.png&#34; alt=&#34;cloud shell&#34; /&gt;&lt;/li&gt;
&lt;li&gt;A Cloud Shell session opens inside a frame at the bottom of the console. Use this shell to run &lt;code&gt;gcloud&lt;/code&gt; and &lt;code&gt;kubectl&lt;/code&gt; commands.&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Set a compute zone in your geographical region with the following command. The compute zone will be something like &lt;code&gt;us-west1-a&lt;/code&gt;. A full list can be found &lt;a href=&#34;https://cloud.google.com/compute/docs/regions-zones/#available&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;gcloud config &lt;span style=&#34;color:#204a87&#34;&gt;set&lt;/span&gt; compute/zone &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;COMPUTE_ZONE&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&#34;local-shell&#34;&gt;Local shell&lt;/h4&gt;

&lt;p&gt;To install &lt;code&gt;gcloud&lt;/code&gt; and &lt;code&gt;kubectl&lt;/code&gt;, perform the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://cloud.google.com/sdk/docs/quickstarts&#34;&gt;Install the Google Cloud SDK&lt;/a&gt;, which includes the &lt;code&gt;gcloud&lt;/code&gt; command-line tool.&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Initialize some default configuration by running the following command.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;When asked &lt;code&gt;Do you want to configure a default Compute Region and Zone? (Y/n)?&lt;/code&gt;, enter &lt;code&gt;Y&lt;/code&gt; and choose a zone in your geographical region of choice.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;gcloud init&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Install the &lt;code&gt;kubectl&lt;/code&gt; command-line tool by running the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;gcloud components install kubectl&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;/h2&gt;

&lt;p&gt;An example configuration can be found here:
 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/terraform-submodules/gke/module.tf&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Terraform configuration with Agones submodule&lt;/a&gt;
.&lt;/p&gt;

&lt;p&gt;Copy this file into a local directory where you will execute the terraform commands.&lt;/p&gt;

&lt;p&gt;The GKE cluster created from the example configuration will contain 3 Node Pools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;default&amp;quot;&lt;/code&gt; node pool with &lt;code&gt;&amp;quot;game-server&amp;quot;&lt;/code&gt; tag, containing 4 nodes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;agones-system&amp;quot;&lt;/code&gt; node pool for Agones Controller.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;agones-metrics&amp;quot;&lt;/code&gt; for monitoring and metrics collecting purpose.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, a &lt;code&gt;&amp;quot;tiller&amp;quot;&lt;/code&gt; service account will be created with ClusterRole.&lt;/p&gt;

&lt;p&gt;Configurable parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;project - your Google Cloud Project ID (required)&lt;/li&gt;
&lt;li&gt;name - the name of the GKE cluster (default is &amp;ldquo;agones-terraform-example&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;agones_version - the version of agones to install (an empty string, which is the default, is the latest version from the &lt;a href=&#34;https://agones.dev/chart/stable&#34;&gt;Helm repository&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;machine_type - machine type for hosting game servers (default is &amp;ldquo;n1-standard-4&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;node_count - count of game server nodes for the default node pool (default is &amp;ldquo;4&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;zone - the name of the &lt;a href=&#34;https://cloud.google.com/compute/docs/regions-zones&#34;&gt;zone&lt;/a&gt; you want your cluster to be
created in (default is &amp;ldquo;us-west1-c&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;network - the name of the VPC network you want your cluster and firewall rules to be connected to (default is &amp;ldquo;default&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;log_level - possible values: Fatal, Error, Warn, Info, Debug (default is &amp;ldquo;info&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;feature_gates - a list of alpha and beta version features to enable. For example, &amp;ldquo;PlayerTracking=true&amp;amp;ContainerPortAllocation=true&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;



&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Warning&lt;/h4&gt;
&lt;p&gt;On the lines that read &lt;code&gt;source = &amp;quot;git::https://github.com/googleforgames/agones.git//install/terraform/modules/gke/?ref=master&amp;quot;&lt;/code&gt;
make sure to change &lt;code&gt;?ref=master&lt;/code&gt; to match your targeted Agones release, as Terraform modules can change between
releases.&lt;/p&gt;

&lt;p&gt;For example, if you are targeting release master, then you will want to have
&lt;code&gt;source = &amp;quot;git::https://github.com/googleforgames/agones.git//install/terraform/modules/gke/?ref=release-master&amp;quot;&lt;/code&gt;
as your source.&lt;/p&gt;

&lt;/div&gt;


&lt;h3 id=&#34;creating-the-cluster&#34;&gt;Creating the cluster&lt;/h3&gt;

&lt;p&gt;In the directory where you created &lt;code&gt;module.tf&lt;/code&gt;, run:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;terraform init
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will cause terraform to clone the Agones repository and use the &lt;code&gt;./install/terraform&lt;/code&gt; folder as a starting point of
Agones submodule, which contains all necessary Terraform configuration files.&lt;/p&gt;

&lt;p&gt;Next, make sure that you can authenticate using gcloud:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gcloud auth application-default login
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now you can create your GKE cluster (optionally specifying the version of Agones you want to use):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;terraform apply -var project=&amp;quot;&amp;lt;YOUR_GCP_ProjectID&amp;gt;&amp;quot; [-var agones_version=&amp;quot;1.0.0&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To verify that the cluster was created successfully, set up your kubectl credentials:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gcloud container clusters get-credentials --zone us-west1-c agones-terraform-example
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then check that you have access to the Kubernetes cluster:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl get nodes
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You should have 6 nodes in &lt;code&gt;Ready&lt;/code&gt; state.&lt;/p&gt;

&lt;h3 id=&#34;uninstall-the-agones-and-delete-gke-cluster&#34;&gt;Uninstall the Agones and delete GKE cluster&lt;/h3&gt;

&lt;p&gt;To delete all resources provisioned by Terraform:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;terraform destroy -var project=&amp;quot;&amp;lt;YOUR_GCP_ProjectID&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/site/site/docs/installation/confirm/&#34;&gt;Confirm Agones is up and running&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Install Agones using YAML</title>
      <link>/site/docs/installation/install-agones/yaml/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/site/docs/installation/install-agones/yaml/</guid>
      <description>
        
        
        



&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Warning&lt;/h4&gt;
&lt;p&gt;Installing Agones with the &lt;code&gt;install.yaml&lt;/code&gt; will setup the TLS certificates stored in this repository for securing
kubernetes webhooks communication.&lt;/p&gt;

&lt;p&gt;If you want to generate new certificates or use your own for production workloads,
we recommend using the &lt;a href=&#34;/site/site/docs/installation/install-agones/helm/&#34;&gt;helm installation&lt;/a&gt;.&lt;/p&gt;

&lt;/div&gt;

&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;kubectl create namespace agones-system
kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/master/install/yaml/install.yaml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can also find the install.yaml in the latest &lt;code&gt;agones-install&lt;/code&gt; zip from the &lt;a href=&#34;https://github.com/googleforgames/agones/releases&#34;&gt;releases&lt;/a&gt; archive.&lt;/p&gt;

&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/site/site/docs/installation/confirm/&#34;&gt;Confirm Agones is up and running&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Unity Game Server Client SDK</title>
      <link>/site/docs/guides/client-sdks/unity/</link>
      <pubDate>Thu, 13 Jun 2019 10:17:50 +0000</pubDate>
      
      <guid>/site/docs/guides/client-sdks/unity/</guid>
      <description>
        
        
        



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
The Unity SDK is not feature complete in 1.2.0, but will be feature complete with the 1.3.0 release.
&lt;/div&gt;


&lt;p&gt;Check the &lt;a href=&#34;/site/site/docs/guides/client-sdks/&#34;&gt;Client SDK Documentation&lt;/a&gt; for more details on each of the SDK functions and how to run the SDK locally.&lt;/p&gt;

&lt;h2 id=&#34;download&#34;&gt;Download&lt;/h2&gt;

&lt;p&gt;Download the source 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/sdks/unity&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;directly from GitHub&lt;/a&gt;
.&lt;/p&gt;

&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Unity &amp;gt;= 2018.x (.NET 4.x)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;

&lt;p&gt;Import this script to your unity project and attach it to GameObject.&lt;/p&gt;

&lt;p&gt;To begin working with the SDK, get an instance of it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agonesGameObject&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GetComponent&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Agones&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AgonesSdk&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To connect to the SDK server, either local or when running on Agones, run the async &lt;code&gt;Connect()&lt;/code&gt; method.
This will wait for up to 30 seconds if the SDK server has not yet started and the connection cannot be made,
and will return &lt;code&gt;false&lt;/code&gt; if there was an issue connecting.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ok&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Connect&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To mark the game server as &lt;a href=&#34;/site/site/docs/guides/client-sdks/#ready&#34;&gt;ready to receive player connections&lt;/a&gt;, call the async method &lt;code&gt;Ready()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;SomeMethod&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;
&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ok&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Ready&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To get the details on the &lt;a href=&#34;/site/site/docs/guides/client-sdks/#gameserver&#34;&gt;backing &lt;code&gt;GameServer&lt;/code&gt;&lt;/a&gt; call &lt;code&gt;GameServer()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Will return &lt;code&gt;null&lt;/code&gt; if there is an error in retrieving the &lt;code&gt;GameServer&lt;/code&gt; record.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;gameserver&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GameServer&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To mark the GameServer as &lt;a href=&#34;/site/site/docs/guides/client-sdks/#reserve-seconds&#34;&gt;Reserved&lt;/a&gt; for a duration call
&lt;code&gt;Reserve(TimeSpan duration)&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;ok&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Reserve&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;duration&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To mark that the &lt;a href=&#34;/site/site/docs/guides/client-sdks/#shutdown&#34;&gt;game session is completed&lt;/a&gt; and the game server should be shut down call &lt;code&gt;Shutdown()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ok&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Shutdown&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Similarly &lt;code&gt;SetAnnotation(string key, string value)&lt;/code&gt; and &lt;code&gt;SetLabel(string key, string value)&lt;/code&gt; are async methods that perform an action.&lt;/p&gt;

&lt;p&gt;And there is no need to call &lt;code&gt;Health()&lt;/code&gt;, it is automatically called.&lt;/p&gt;

&lt;p&gt;To watch when
&lt;a href=&#34;/site/site/docs/guides/client-sdks/#watchgameserver-function-gameserver&#34;&gt;the backing &lt;code&gt;GameServer&lt;/code&gt; configuration changes&lt;/a&gt;
call &lt;code&gt;WatchGameServer(callback)&lt;/code&gt;, where the delegate function &lt;code&gt;callback&lt;/code&gt; will be executed every time the &lt;code&gt;GameServer&lt;/code&gt;
configuration changes.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WatchGameServer&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;gameServer&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Debug&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Log&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;$&amp;#34;Server - Watch {gameServer}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Warning&lt;/h4&gt;
&lt;p&gt;&lt;p&gt;The following code causes deadlock. Do not use a &lt;code&gt;Wait&lt;/code&gt; method with the returned Task.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Deadlock&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;
&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color:#000&#34;&gt;Task&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Shutdown&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color:#000&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Wait&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// deadlock!!!
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;

&lt;/div&gt;


&lt;h2 id=&#34;settings&#34;&gt;Settings&lt;/h2&gt;

&lt;p&gt;The properties for the Unity Agones SDK can be found in the Inspector.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Health Interval Second

&lt;ul&gt;
&lt;li&gt;Interval of the server sending a health ping to the Agones sidecar. (default: &lt;code&gt;5&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Health Enabled

&lt;ul&gt;
&lt;li&gt;Whether the server sends a health ping to the Agones sidecar. (default: &lt;code&gt;true&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Log Enabled

&lt;ul&gt;
&lt;li&gt;Debug Logging Enabled. Debug logging for development of this Plugin. (default: &lt;code&gt;false&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: GameServer Creation, Allocation and Shutdown Lifecycle</title>
      <link>/site/docs/guides/gameserver-lifecycle/</link>
      <pubDate>Fri, 01 Feb 2019 02:15:18 +0000</pubDate>
      
      <guid>/site/docs/guides/gameserver-lifecycle/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;matchmaker-requests-a-gameserver-from-a-fleet&#34;&gt;Matchmaker requests a GameServer from a Fleet&lt;/h2&gt;

&lt;p&gt;This is the preferred workflow for a GameServer, in which an external matchmaker requests an allocation from one or more
&lt;code&gt;Fleets&lt;/code&gt; using a &lt;code&gt;GameServerAllocation&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;../../../diagrams/gameserver-lifecycle.puml.png&#34; alt=&#34;Allocated Lifecycle Sequence Diagram&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;matchmaker-requires-game-server-process-registration&#34;&gt;Matchmaker requires game server process registration&lt;/h2&gt;

&lt;p&gt;Scenarios in which a Matchmaker requires a game server process to register themselves with the matchmaker, and the
matchmaker decides which &lt;code&gt;GameServer&lt;/code&gt; players are sent to, this flow is common:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;../../../diagrams/gameserver-reserved.puml.png&#34; alt=&#34;Reserved Lifecycle Sequence Diagram&#34; /&gt;&lt;/p&gt;



&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Warning&lt;/h4&gt;
This does relinquish control over how &lt;code&gt;GameServers&lt;/code&gt; are packed across the cluster to the external matchmaker. It is likely
  it will not do as good a job at packing and scaling as Agones.
&lt;/div&gt;


&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps:&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Read the various references, including the &lt;a href=&#34;/site/site/docs/reference/gameserver/&#34;&gt;GameServer&lt;/a&gt; and &lt;a href=&#34;/site/site/docs/reference/fleet/&#34;&gt;Fleet&lt;/a&gt; reference materials.&lt;/li&gt;
&lt;li&gt;Review the specifics of &lt;a href=&#34;/site/site/docs/guides/health-checking/&#34;&gt;Health Checking&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;See all the commands the &lt;a href=&#34;/site/site/docs/guides/client-sdks/&#34;&gt;Client SDK&lt;/a&gt; provides - we only show a few here!&lt;/li&gt;
&lt;li&gt;If you aren&amp;rsquo;t familiar with the term &lt;a href=&#34;https://kubernetes.io/docs/concepts/workloads/pods/pod/&#34;&gt;Pod&lt;/a&gt;, this should provide a reference.&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Installing Agones on AWS Elastic Kubernetes Service using Terraform</title>
      <link>/site/docs/installation/terraform/eks/</link>
      <pubDate>Tue, 21 Jan 2020 00:00:00 +0000</pubDate>
      
      <guid>/site/docs/installation/terraform/eks/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;/h2&gt;

&lt;p&gt;You can use Terraform to provision your Amazon EKS (Elastic Kubernetes Service) cluster and install Agones on it using the Helm Terraform provider.&lt;/p&gt;

&lt;p&gt;An example of the EKS submodule config file can be found here:
 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/terraform-submodules/eks/module.tf&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Terraform configuration with Agones submodule&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Copy this file into a separate folder.&lt;/p&gt;

&lt;p&gt;Configure your AWS CLI tool &lt;a href=&#34;https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html&#34;&gt;CLI configure&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;aws configure
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Initialise your terraform:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;terraform init
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;creating-cluster&#34;&gt;Creating Cluster&lt;/h3&gt;

&lt;p&gt;By editing &lt;code&gt;modules.tf&lt;/code&gt; you can change the parameters that you need to. For instance, the - &lt;code&gt;machine_type&lt;/code&gt; variable.&lt;/p&gt;

&lt;p&gt;Configurable parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cluster_name - the name of the EKS cluster (default is &amp;ldquo;agones-terraform-example&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;agones_version - the version of agones to install (an empty string, which is the default, is the latest version from the &lt;a href=&#34;https://agones.dev/chart/stable&#34;&gt;Helm repository&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;machine_type - EC2 instance type for hosting game servers (default is &amp;ldquo;t2.large&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;region - the location of the cluster (default is &amp;ldquo;us-west2&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;node_count - count of game server nodes for the default node pool (default is &amp;ldquo;4&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;log_level - possible values: Fatal, Error, Warn, Info, Debug (default is &amp;ldquo;info&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;feature_gates - a list of alpha and beta version features to enable. For example, &amp;ldquo;PlayerTracking=true&amp;amp;ContainerPortAllocation=true&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now you can create an EKS cluster and deploy Agones on EKS:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;terraform apply [-var agones_version=&amp;quot;1.7.0&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;After deploying the cluster with Agones, you can get or update your kubeconfig by using:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;aws eks --region us-west-2 update-kubeconfig --name agones-cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With the following output:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Added new context arn:aws:eks:us-west-2:601646756426:cluster/agones-cluster to /Users/user/.kube/config
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Switch &lt;code&gt;kubectl&lt;/code&gt; context to the recently created one:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl config use-context arn:aws:eks:us-west-2:601646756426:cluster/agones-cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Check that you are authenticated against the recently created Kubernetes cluster:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl get nodes
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;uninstall-the-agones-and-delete-eks-cluster&#34;&gt;Uninstall the Agones and delete EKS cluster&lt;/h3&gt;

&lt;p&gt;Run the following commands to delete all Terraform provisioned resources:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;terraform destroy -target module.helm_agones.helm_release.agones -auto-approve &amp;amp;&amp;amp; sleep 60
terraform destroy
&lt;/code&gt;&lt;/pre&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
There is an issue with the AWS Terraform provider:
&lt;a href=&#34;https://github.com/terraform-providers/terraform-provider-aws/issues/9101&#34;&gt;https://github.com/terraform-providers/terraform-provider-aws/issues/9101&lt;/a&gt;
Due to this issue you should remove helm release first (as stated above),
otherwise &lt;code&gt;terraform destroy&lt;/code&gt; will timeout and never succeed.
Remove all created resources manually in that case, namely: 3 Auto Scaling groups, EKS cluster, and a VPC with all dependent resources.
&lt;/div&gt;


      </description>
    </item>
    
    <item>
      <title>Docs: Third Party Podcasts</title>
      <link>/site/docs/third-party-content/podcasts/</link>
      <pubDate>Wed, 15 Jan 2020 00:00:00 +0000</pubDate>
      
      <guid>/site/docs/third-party-content/podcasts/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;2019&#34;&gt;2019&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Nov 6 - &lt;a href=&#34;https://gcppodcast.com/post/episode-202-supersolid-with-kami-may/&#34;&gt;Google Cloud Platform Podcast: Supersolid with Kami May&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;2018&#34;&gt;2018&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Oct 23 - &lt;a href=&#34;https://kubernetespodcast.com/episode/026-agones/&#34;&gt;Kubernetes Podcast: Agones, with Cyril Tovena and Mark Mandel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Aug 15 - &lt;a href=&#34;https://gcppodcast.com/post/episode-142-agones-with-mark-mandel-and-cyril-tovena/&#34;&gt;Google Cloud Platform Podcast: Agones with Mark Mandel and Cyril Tovena&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Fleet Updates</title>
      <link>/site/docs/guides/fleet-updates/</link>
      <pubDate>Tue, 27 Aug 2019 03:58:19 +0000</pubDate>
      
      <guid>/site/docs/guides/fleet-updates/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;rolling-update-strategy&#34;&gt;Rolling Update Strategy&lt;/h2&gt;

&lt;p&gt;When Fleets are edited and updated, the default strategy of Agones is to roll the new version of the &lt;code&gt;GameServer&lt;/code&gt;
out to the entire &lt;code&gt;Fleet&lt;/code&gt;, in a step by step increment and decrement by adding a chunk of the new version and removing
a chunk of the current set of &lt;code&gt;GameServers&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is done while ensuring that &lt;code&gt;Allocated&lt;/code&gt; &lt;code&gt;GameServers&lt;/code&gt; are not deleted
until they are specifically shutdown through the game servers SDK, as they are expected to have players on them.&lt;/p&gt;

&lt;p&gt;You can see this in the &lt;code&gt;Fleet.Spec.Strategy&lt;/code&gt; &lt;a href=&#34;/site/site/docs/reference/fleet/&#34;&gt;reference&lt;/a&gt;, with controls for how
much of the &lt;code&gt;Fleet&lt;/code&gt; is  incremented and decremented at one time:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;strategy&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;type&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;RollingUpdate&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;rollingUpdate&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;maxSurge&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;25&lt;/span&gt;%&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;maxUnavailable&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;25&lt;/span&gt;%&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So when a Fleet is edited (any field other than &lt;code&gt;replicas&lt;/code&gt;, see note below), either through &lt;code&gt;kubectl&lt;/code&gt; &lt;code&gt;edit&lt;/code&gt;/&lt;code&gt;apply&lt;/code&gt; or via the Kubernetes API, this performs the following operations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Adds the &lt;code&gt;maxSurge&lt;/code&gt; number of &lt;code&gt;GameServers&lt;/code&gt; to the Fleet.&lt;/li&gt;
&lt;li&gt;Shutdown the &lt;code&gt;maxUnavailable&lt;/code&gt; number of &lt;code&gt;GameServers&lt;/code&gt; in the Fleet, skipping &lt;code&gt;Allocated&lt;/code&gt; &lt;code&gt;GameServers&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Repeat above steps until all the previous &lt;code&gt;GameServer&lt;/code&gt; configurations have been &lt;code&gt;Shutdown&lt;/code&gt; and deleted.&lt;/li&gt;
&lt;/ol&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
&lt;p&gt;When &lt;code&gt;Fleet&lt;/code&gt; update contains only changes to the &lt;code&gt;replicas&lt;/code&gt; parameter, then new GameServers will be created/deleted straight away,
which means in that case &lt;code&gt;maxSurge&lt;/code&gt; and &lt;code&gt;maxUnavailable&lt;/code&gt; parameters for a RollingUpdate will not be used.
The RollingUpdate strategy takes place when you update &lt;code&gt;spec&lt;/code&gt; parameters other than &lt;code&gt;replicas&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you are using a Fleet which is scaled by a FleetAutoscaler, &lt;a href=&#34;/site/site/docs/getting-started/create-fleetautoscaler/#7-change-autoscaling-parameters&#34;&gt;read the Fleetautoscaler guide&lt;/a&gt; for more details on how RollingUpdates with FleetAutoscalers need to be implemented.&lt;/p&gt;

&lt;p&gt;You could also check the behaviour of the Fleet with a RollingUpdate strategy on a test &lt;code&gt;Fleet&lt;/code&gt; to preview your upcoming updates.
Use &lt;code&gt;kubectl describe fleet&lt;/code&gt; to track scaling events in a Fleet.&lt;/p&gt;

&lt;/div&gt;


&lt;h2 id=&#34;recreate-strategy&#34;&gt;Recreate Strategy&lt;/h2&gt;

&lt;p&gt;This is an optimal &lt;code&gt;Fleet&lt;/code&gt; update strategy if you want to replace all &lt;code&gt;GameServers&lt;/code&gt; that are not &lt;code&gt;Allocated&lt;/code&gt;
with a new version as quickly as possible.&lt;/p&gt;

&lt;p&gt;You can see this in the &lt;code&gt;Fleet.Spec.Strategy&lt;/code&gt; &lt;a href=&#34;/site/site/docs/reference/fleet/&#34;&gt;reference&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;strategy&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;type&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;Recreate&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So when a Fleet is edited, either through &lt;code&gt;kubectl&lt;/code&gt; &lt;code&gt;edit&lt;/code&gt;/&lt;code&gt;apply&lt;/code&gt; or via the Kubernetes API, this performs the following operations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Shutdown&lt;/code&gt; all &lt;code&gt;GameServers&lt;/code&gt; in the Fleet that are not currently &lt;code&gt;Allocated&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Create the same number of the new version of the &lt;code&gt;GameServers&lt;/code&gt; that were previously deleted.&lt;/li&gt;
&lt;li&gt;Repeat above steps until all the previous &lt;code&gt;GameServer&lt;/code&gt; configurations have been &lt;code&gt;Shutdown&lt;/code&gt; and deleted.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;two-or-more-fleets-strategy&#34;&gt;Two (or more) Fleets Strategy&lt;/h2&gt;

&lt;p&gt;If you want very fine-grained control over the rate that new versions of a &lt;code&gt;GameServer&lt;/code&gt; configuration is rolled out, or
if you want to do some version of A/B testing or smoke test between different versions, running two (or more) &lt;code&gt;Fleets&lt;/code&gt; at the same time is a
good solution for this.&lt;/p&gt;

&lt;p&gt;To do this, create a second &lt;code&gt;Fleet&lt;/code&gt; inside your cluster, starting with zero replicas. From there you can scale this newer &lt;code&gt;Fleet&lt;/code&gt;
up and the older &lt;code&gt;Fleet&lt;/code&gt; down as required by your specific rollout strategy.&lt;/p&gt;

&lt;p&gt;This also allows you to rollback if issues arise with the newer version, as you can delete the newer &lt;code&gt;Fleet&lt;/code&gt;
and scale up the old Fleet to its previous levels, resulting in minimal impact to the players.&lt;/p&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
For GameServerAllocation, you will need to have at least a single shared label between the &lt;code&gt;GameServers&lt;/code&gt; in each
Fleet.
&lt;/div&gt;


&lt;h3 id=&#34;gameserverallocation-across-fleets&#34;&gt;GameServerAllocation Across Fleets&lt;/h3&gt;

&lt;p&gt;Since &lt;code&gt;GameServerAllocation&lt;/code&gt; is powered by label selectors, it is possible to allocate across multiple fleets, and/or
give preference to particular sets of &lt;code&gt;GameServers&lt;/code&gt; over others. You can see details of this in
the &lt;code&gt;GameServerAllocation&lt;/code&gt; &lt;a href=&#34;/site/site/docs/reference/gameserverallocation/&#34;&gt;reference&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In a scenario where a new &lt;code&gt;v2&lt;/code&gt; version of a &lt;code&gt;Fleet&lt;/code&gt; is being slowly scaled up in a separate Fleet from the previous &lt;code&gt;v1&lt;/code&gt;
Fleet, we can specify that we &lt;code&gt;prefer&lt;/code&gt; allocation to occur from the &lt;code&gt;v2&lt;/code&gt; Fleet, and if none are available, fallback to
the &lt;code&gt;v1&lt;/code&gt; Fleet, like so:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;apiVersion&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;allocation.agones.dev/v1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;kind&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;GameServerAllocation&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;required&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;matchLabels&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;game&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;my-awesome-game&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;preferred&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;matchLabels&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;agones.dev/fleet&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;v2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In this example, all &lt;code&gt;GameServers&lt;/code&gt; have the label &lt;code&gt;game: my-awesome-game&lt;/code&gt;, so the Allocation will search across both
Fleets through that mechanism. The &lt;code&gt;preferred&lt;/code&gt; label matching selector tells the allocation system to first search
all &lt;code&gt;GameServers&lt;/code&gt; with the &lt;code&gt;v2&lt;/code&gt; &lt;code&gt;Fleet&lt;/code&gt; label, and if not found, search through the rest of the set.&lt;/p&gt;

&lt;p&gt;The above &lt;code&gt;GameServerAllocation&lt;/code&gt; can then be used while you scale up the &lt;code&gt;v2&lt;/code&gt; Fleet and scale down the original Fleet at
the rate that you deem fit for your specific rollout.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Fleet Specification</title>
      <link>/site/docs/reference/fleet/</link>
      <pubDate>Thu, 03 Jan 2019 03:58:52 +0000</pubDate>
      
      <guid>/site/docs/reference/fleet/</guid>
      <description>
        
        
        

&lt;p&gt;To allocate a &lt;code&gt;GameServer&lt;/code&gt; from a &lt;code&gt;Fleet&lt;/code&gt;, use a &lt;code&gt;GameServerAllocation&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Like any other Kubernetes resource you describe a &lt;code&gt;Fleet&lt;/code&gt;&amp;rsquo;s desired state via a specification written in YAML or JSON to the Kubernetes API. The Agones controller will then change the actual state to the desired state.&lt;/p&gt;

&lt;p&gt;A full &lt;code&gt;Fleet&lt;/code&gt; specification is available below and in the 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/fleet.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;example folder&lt;/a&gt;
 for reference :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;apiVersion&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones.dev/v1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;kind&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;Fleet&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Fleet Metadata&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# https://v1-15.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.15/#objectmeta-v1-meta&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;metadata&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;fleet-example&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# the number of GameServers to keep Ready or Allocated in this Fleet&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;replicas&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# defines how GameServers are organised across the cluster.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Options include:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# &amp;#34;Packed&amp;#34; (default) is aimed at dynamic Kubernetes clusters, such as cloud providers, wherein we want to bin pack&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# resources&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# &amp;#34;Distributed&amp;#34; is aimed at static Kubernetes clusters, wherein we want to distribute resources across the entire&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# cluster&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;scheduling&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;Packed&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# a GameServer template - see:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# https://agones.dev/site/docs/reference/gameserver/ for all the options&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;strategy&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# The replacement strategy for when the GameServer template is changed. Default option is &amp;#34;RollingUpdate&amp;#34;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# &amp;#34;RollingUpdate&amp;#34; will increment by maxSurge value on each iteration, while decrementing by maxUnavailable on each&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# iteration, until all GameServers have been switched from one version to another.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# &amp;#34;Recreate&amp;#34; terminates all non-allocated GameServers, and starts up a new set with the new details to replace them.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;type&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;RollingUpdate&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Only relevant when `type: RollingUpdate`&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;rollingUpdate&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# the amount to increment the new GameServers by. Defaults to 25%&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;maxSurge&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;25&lt;/span&gt;%&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# the amount to decrements GameServers by. Defaults to 25%&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;maxUnavailable&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;25&lt;/span&gt;%&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;template&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# GameServer metadata&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;metadata&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;labels&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;foo&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;bar&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# GameServer specification&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;ports&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;default&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;portPolicy&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;Dynamic&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;containerPort&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;26000&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;health&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;initialDelaySeconds&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;30&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;periodSeconds&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;60&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Parameters for game server sidecar&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;sdkServer&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;logLevel&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;Info&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;grpcPort&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;9357&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;httpPort&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;9358&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# The GameServer&amp;#39;s Pod template&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;template&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;          &lt;/span&gt;containers&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;          &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;simple-udp&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;            &lt;/span&gt;image&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;gcr.io/agones-images/udp-server&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0.21&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Since Agones defines a new
&lt;a href=&#34;https://kubernetes.io/docs/concepts/api-extension/custom-resources/&#34;&gt;Custom Resources Definition (CRD)&lt;/a&gt;
we can define a new resource using the kind &lt;code&gt;Fleet&lt;/code&gt; with the custom group &lt;code&gt;agones.dev&lt;/code&gt; and API
version &lt;code&gt;v1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can use the metadata field to target a specific
&lt;a href=&#34;https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/&#34;&gt;namespaces&lt;/a&gt; but also
attach specific &lt;a href=&#34;https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/&#34;&gt;annotations&lt;/a&gt;
and &lt;a href=&#34;https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/&#34;&gt;labels&lt;/a&gt; to your resource.
This is a very common pattern in the Kubernetes ecosystem.&lt;/p&gt;

&lt;p&gt;The length of the &lt;code&gt;name&lt;/code&gt; field of the fleet should be at most 63 characters.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;spec&lt;/code&gt; field is the actual &lt;code&gt;Fleet&lt;/code&gt; specification and it is composed as follow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;replicas&lt;/code&gt; is the number of &lt;code&gt;GameServers&lt;/code&gt; to keep Ready or Allocated in this Fleet&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scheduling&lt;/code&gt; defines how GameServers are organised across the cluster. Affects backing Pod scheduling, as well as scale
             down mechanics.
             &amp;ldquo;Packed&amp;rdquo; (default) is aimed at dynamic Kubernetes clusters, such as cloud providers, wherein we want to bin pack
             resources. &amp;ldquo;Distributed&amp;rdquo; is aimed at static Kubernetes clusters, wherein we want to distribute resources across the entire
             cluster. See &lt;a href=&#34;/site/site/docs/advanced/scheduling-and-autoscaling/&#34;&gt;Scheduling and Autoscaling&lt;/a&gt; for more details.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;strategy&lt;/code&gt; is the &lt;code&gt;GameServer&lt;/code&gt; replacement strategy for when the &lt;code&gt;GameServer&lt;/code&gt; template is edited.

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;type&lt;/code&gt; is replacement strategy for when the GameServer template is changed. Default option is &amp;ldquo;RollingUpdate&amp;rdquo;, but &amp;ldquo;Recreate&amp;rdquo; is also available.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RollingUpdate&lt;/code&gt; will increment by &lt;code&gt;maxSurge&lt;/code&gt; value on each iteration, while decrementing by &lt;code&gt;maxUnavailable&lt;/code&gt; on each iteration, until all GameServers have been switched from one version to another.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Recreate&lt;/code&gt; terminates all non-allocated &lt;code&gt;GameServers&lt;/code&gt;, and starts up a new set with the new &lt;code&gt;GameServer&lt;/code&gt; configuration to replace them.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rollingUpdate&lt;/code&gt; is only relevant when &lt;code&gt;type: RollingUpdate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;maxSurge&lt;/code&gt; is the amount to increment the new GameServers by. Defaults to 25%&lt;/li&gt;
&lt;li&gt;&lt;code&gt;maxUnavailable&lt;/code&gt; is the amount to decrements GameServers by. Defaults to 25%&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;template&lt;/code&gt; a full &lt;code&gt;GameServer&lt;/code&gt; configuration template.
See the &lt;a href=&#34;/site/site/docs/reference/gameserver/&#34;&gt;GameServer&lt;/a&gt; reference for all available fields.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;fleet-scale-subresource-specification&#34;&gt;Fleet Scale Subresource Specification&lt;/h2&gt;

&lt;p&gt;Scale subresource is defined for a Fleet. Please refer to &lt;a href=&#34;https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#subresources&#34;&gt;Kubernetes docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can use the following command to scale the fleet with name simple-udp:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl scale fleet simple-udp --replicas&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;10&lt;/span&gt;
fleet.agones.dev/simple-udp scaled&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can also use &lt;a href=&#34;/site/site/docs/guides/access-api/&#34;&gt;Kubernetes API&lt;/a&gt; to get or update the Replicas count:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl http://localhost:8001/apis/agones.dev/v1/namespaces/default/fleets/simple-udp/scale
...
{
  &amp;quot;kind&amp;quot;: &amp;quot;Scale&amp;quot;,
  &amp;quot;apiVersion&amp;quot;: &amp;quot;autoscaling/v1&amp;quot;,
  &amp;quot;metadata&amp;quot;: {
    &amp;quot;name&amp;quot;: &amp;quot;simple-udp&amp;quot;,
    &amp;quot;namespace&amp;quot;: &amp;quot;default&amp;quot;,
    &amp;quot;selfLink&amp;quot;: &amp;quot;/apis/agones.dev/v1/namespaces/default/fleets/simple-udp/scale&amp;quot;,
    &amp;quot;uid&amp;quot;: &amp;quot;4dfaa310-2566-11e9-afd1-42010a8a0058&amp;quot;,
    &amp;quot;resourceVersion&amp;quot;: &amp;quot;292652&amp;quot;,
    &amp;quot;creationTimestamp&amp;quot;: &amp;quot;2019-01-31T14:41:33Z&amp;quot;
  },
  &amp;quot;spec&amp;quot;: {
    &amp;quot;replicas&amp;quot;: 10
  },
  &amp;quot;status&amp;quot;: {
    &amp;quot;replicas&amp;quot;: 10
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Also exposing a Scale subresource would allow you to configure HorizontalPodAutoscaler and PodDisruptionBudget for a fleet in the future. However these features have not been tested, and are not currently supported - but if you are looking for these features, please be sure to let us know in the &lt;a href=&#34;https://github.com/googleforgames/agones/issues/553&#34;&gt;ticket&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: GameServer Health Checking</title>
      <link>/site/docs/guides/health-checking/</link>
      <pubDate>Thu, 03 Jan 2019 01:20:19 +0000</pubDate>
      
      <guid>/site/docs/guides/health-checking/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;disabling-health-checking&#34;&gt;Disabling Health Checking&lt;/h2&gt;

&lt;p&gt;By default, health checking is enabled, but it can be turned off by setting the &lt;code&gt;spec.health.disabled&lt;/code&gt; property to
true.&lt;/p&gt;

&lt;h2 id=&#34;sdk-api&#34;&gt;SDK API&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;Health()&lt;/code&gt; function on the &lt;a href=&#34;/site/site/docs/guides/client-sdks/&#34;&gt;SDK object&lt;/a&gt; needs to be called at an
interval less than the &lt;code&gt;spec.health.periodSeconds&lt;/code&gt;
threshold time to be considered before it will be considered a &lt;code&gt;failure&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The health check will also need to have not been called a consecutive number of times (&lt;code&gt;spec.health.failureTheshold&lt;/code&gt;),
giving it a chance to heal if it there is an issue.&lt;/p&gt;

&lt;h2 id=&#34;health-failure-strategy&#34;&gt;Health Failure Strategy&lt;/h2&gt;

&lt;p&gt;The following is the process for what happens to a &lt;code&gt;GameServer&lt;/code&gt; when it is unhealthy.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If the &lt;code&gt;GameServer&lt;/code&gt; container exits with an error before the &lt;code&gt;GameServer&lt;/code&gt; moves to &lt;code&gt;Ready&lt;/code&gt; then,
it is restarted as per the &lt;code&gt;restartPolicy&lt;/code&gt; (which defaults to &amp;ldquo;Always&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;If the &lt;code&gt;GameServer&lt;/code&gt; fails health checking at any point, then it doesn&amp;rsquo;t restart,
but moves to an &lt;code&gt;Unhealthy&lt;/code&gt; state.&lt;/li&gt;
&lt;li&gt;If the &lt;code&gt;GameServer&lt;/code&gt; container exits while in &lt;code&gt;Ready&lt;/code&gt;, &lt;code&gt;Allocated&lt;/code&gt; or &lt;code&gt;Reserved&lt;/code&gt; state, it will be restarted
as per the &lt;code&gt;restartPolicy&lt;/code&gt;  (which defaults to &amp;ldquo;Always&amp;rdquo;, since &lt;code&gt;RestartPolicy&lt;/code&gt; is a &lt;code&gt;Pod&lt;/code&gt; wide setting),
but will immediately move to an &lt;code&gt;Unhealthy&lt;/code&gt; state.&lt;/li&gt;
&lt;li&gt;If the SDK sidecar fails, then it will be restarted, assuming the &lt;code&gt;RestartPolicy&lt;/code&gt; is Always/OnFailure.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;fleet-management-of-unhealthy-gameservers&#34;&gt;Fleet Management of Unhealthy GameServers&lt;/h2&gt;

&lt;p&gt;If a &lt;code&gt;GameServer&lt;/code&gt; moves into an &lt;code&gt;Unhealthy&lt;/code&gt; state when it is not part of a Fleet, the &lt;code&gt;GameServer&lt;/code&gt; will remain in the
Unhealthy state until explicitly deleted.  This is useful for debugging &lt;code&gt;Unhealthy&lt;/code&gt; &lt;code&gt;GameServers&lt;/code&gt;, or if you are
creating your own &lt;code&gt;GameServer&lt;/code&gt; management layer, you can explicitly choose what to do if a &lt;code&gt;GameServer&lt;/code&gt; becomes
&lt;code&gt;Unhealthy&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If a &lt;code&gt;GameServer&lt;/code&gt; is part of a &lt;code&gt;Fleet&lt;/code&gt;, the &lt;code&gt;Fleet&lt;/code&gt; management system will &lt;em&gt;delete&lt;/em&gt; any &lt;code&gt;Unhealthy&lt;/code&gt; &lt;code&gt;GameServers&lt;/code&gt; and
immediately replace them with a brand new &lt;code&gt;GameServer&lt;/code&gt; to ensure it has the configured number of Replicas.&lt;/p&gt;

&lt;h2 id=&#34;configuration-reference&#34;&gt;Configuration Reference&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Health checking for the running game server&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;health&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Disable health checking. defaults to false, but can be set to true&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;disabled&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Number of seconds after the container has started before health check is initiated. Defaults to 5 seconds&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;initialDelaySeconds&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# If the `Health()` function doesn&amp;#39;t get called at least once every period (seconds), then&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# the game server is not healthy. Defaults to 5&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;periodSeconds&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Minimum consecutive failures for the health probe to be considered failed after having succeeded.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Defaults to 3. Minimum value is 1&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;failureThreshold&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;3&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;See the 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/gameserver.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;full GameServer example&lt;/a&gt;
 for more details&lt;/p&gt;

&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;

&lt;h3 id=&#34;c&#34;&gt;C++&lt;/h3&gt;

&lt;p&gt;For a configuration that requires a health ping every 5 seconds, the example below sends a request every 2 seconds
to be sure that the GameServer is under the threshold.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;doHealth&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SDK&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Health&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;())&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;cout&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Health ping failed&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;endl&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;cout&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Health ping sent&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;endl&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
        &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;this_thread&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;sleep_for&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;chrono&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;seconds&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;main&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SDK&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SDK&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;connected&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Connect&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;connected&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;thread&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;health&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;doHealth&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// ...  run the game server code
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;full-game-server&#34;&gt;Full Game Server&lt;/h3&gt;

&lt;p&gt;Also look in the 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;examples&lt;/a&gt;
 directory.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: C&#43;&#43; Game Server Client SDK</title>
      <link>/site/docs/guides/client-sdks/cpp/</link>
      <pubDate>Wed, 02 Jan 2019 10:17:50 +0000</pubDate>
      
      <guid>/site/docs/guides/client-sdks/cpp/</guid>
      <description>
        
        
        

&lt;p&gt;Check the &lt;a href=&#34;/site/site/docs/guides/client-sdks/&#34;&gt;Client SDK Documentation&lt;/a&gt; for more details on each of the SDK functions and how to run the SDK locally.&lt;/p&gt;

&lt;h2 id=&#34;download&#34;&gt;Download&lt;/h2&gt;

&lt;p&gt;Download the source from the &lt;a href=&#34;https://github.com/googleforgames/agones/releases&#34;&gt;Releases Page&lt;/a&gt;
or 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/sdks/cpp&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;directly from GitHub&lt;/a&gt;
.&lt;/p&gt;

&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;

&lt;p&gt;The C++ SDK is specifically designed to be as simple as possible, and deliberately doesn&amp;rsquo;t include any kind
of singleton management, or threading/asynchronous processing to allow developers to manage these aspects as they deem
appropriate for their system.&lt;/p&gt;

&lt;p&gt;We may consider these types of features in the future, depending on demand.&lt;/p&gt;

&lt;p&gt;To begin working with the SDK, create an instance of it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SDK&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SDK&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To connect to the SDK server, either local or when running on Agones, run the &lt;code&gt;sdk-&amp;gt;Connect()&lt;/code&gt; method.
This will block for up to 30 seconds if the SDK server has not yet started and the connection cannot be made,
and will return &lt;code&gt;false&lt;/code&gt; if there was an issue connecting.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ok&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Connect&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To send a &lt;a href=&#34;/site/site/docs/guides/client-sdks/#health&#34;&gt;health check&lt;/a&gt; call &lt;code&gt;sdk-&amp;gt;Health()&lt;/code&gt;. This is a synchronous request that will
return &lt;code&gt;false&lt;/code&gt; if it has failed in any way. Read &lt;a href=&#34;/site/site/docs/guides/health-checking/&#34;&gt;GameServer Health Checking&lt;/a&gt; for more
details on the game server health checking strategy.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ok&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Health&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To mark the game server as &lt;a href=&#34;/site/site/docs/guides/client-sdks/#ready&#34;&gt;ready to receive player connections&lt;/a&gt;, call &lt;code&gt;sdk-&amp;gt;Ready()&lt;/code&gt;.
This will return a grpc::Status object, from which we can call &lt;code&gt;status.ok()&lt;/code&gt; to determine
if the function completed successfully.&lt;/p&gt;

&lt;p&gt;For more information you can also look at the &lt;a href=&#34;https://grpc.io/grpc/cpp/classgrpc_1_1_status.html&#34;&gt;gRPC Status reference&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;grpc&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Status&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Ready&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ok&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;())&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To mark the game server as &lt;a href=&#34;/site/site/docs/guides/client-sdks/#allocate&#34;&gt;allocated&lt;/a&gt;, call &lt;code&gt;sdk-&amp;gt;Allocate()&lt;/code&gt;.
This will return a grpc::Status object, from which we can call &lt;code&gt;status.ok()&lt;/code&gt; to determine
if the function completed successfully.&lt;/p&gt;

&lt;p&gt;For more information you can also look at the &lt;a href=&#34;https://grpc.io/grpc/cpp/classgrpc_1_1_status.html&#34;&gt;gRPC Status reference&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;grpc&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Status&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Allocate&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ok&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;())&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To mark the game server as &lt;a href=&#34;/site/site/docs/guides/client-sdks/#reserve-seconds&#34;&gt;reserved&lt;/a&gt;, call
&lt;code&gt;sdk-&amp;gt;Reserve(seconds)&lt;/code&gt;. This will return a grpc::Status object, from which we can call &lt;code&gt;status.ok()&lt;/code&gt; to determine
if the function completed successfully.&lt;/p&gt;

&lt;p&gt;For more information you can also look at the &lt;a href=&#34;https://grpc.io/grpc/cpp/classgrpc_1_1_status.html&#34;&gt;gRPC Status reference&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;grpc&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Status&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Reserve&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;chrono&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;seconds&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;N&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;));&lt;/span&gt;
&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ok&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;())&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To mark that the &lt;a href=&#34;/site/site/docs/guides/client-sdks/#shutdown&#34;&gt;game session is completed&lt;/a&gt; and the game server should be shut down call &lt;code&gt;sdk-&amp;gt;Shutdown()&lt;/code&gt;.
This will return a grpc::Status object, from which we can call &lt;code&gt;status.ok()&lt;/code&gt; to determine
if the function completed successfully.&lt;/p&gt;

&lt;p&gt;For more information you can also look at the &lt;a href=&#34;https://grpc.io/grpc/cpp/classgrpc_1_1_status.html&#34;&gt;gRPC Status reference&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;grpc&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Status&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Shutdown&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ok&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;())&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To &lt;a href=&#34;/site/site/docs/guides/client-sdks/#setlabel-key-value&#34;&gt;set a Label&lt;/a&gt; on the backing &lt;code&gt;GameServer&lt;/code&gt; call
&lt;code&gt;sdk-&amp;gt;SetLabel(key, value)&lt;/code&gt;.
This will return a grpc::Status object, from which we can call &lt;code&gt;status.ok()&lt;/code&gt; to determine
if the function completed successfully.&lt;/p&gt;

&lt;p&gt;For more information you can also look at the &lt;a href=&#34;https://grpc.io/grpc/cpp/classgrpc_1_1_status.html&#34;&gt;gRPC Status reference&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;grpc&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Status&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SetLabel&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;test-label&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;test-value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ok&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;())&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To &lt;a href=&#34;/site/site/docs/guides/client-sdks/#setannotation-key-value&#34;&gt;set an Annotation&lt;/a&gt; on the backing &lt;code&gt;GameServer&lt;/code&gt; call
&lt;code&gt;sdk-&amp;gt;SetAnnotation(key, value)&lt;/code&gt;.
This will return a grpc::Status object, from which we can call &lt;code&gt;status.ok()&lt;/code&gt; to determine
if the function completed successfully.&lt;/p&gt;

&lt;p&gt;For more information you can also look at the &lt;a href=&#34;https://grpc.io/grpc/cpp/classgrpc_1_1_status.html&#34;&gt;gRPC Status reference&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SetAnnotation&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;test-annotation&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;test value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ok&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;())&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To get the details on the &lt;a href=&#34;/site/site/docs/guides/client-sdks/#gameserver&#34;&gt;backing &lt;code&gt;GameServer&lt;/code&gt;&lt;/a&gt; call &lt;code&gt;sdk-&amp;gt;GameServer(&amp;amp;gameserver)&lt;/code&gt;,
passing in a &lt;code&gt;agones::dev::sdk::GameServer*&lt;/code&gt; to push the results of the &lt;code&gt;GameServer&lt;/code&gt; configuration into.&lt;/p&gt;

&lt;p&gt;This function will return a grpc::Status object, from which we can call &lt;code&gt;status.ok()&lt;/code&gt; to determine
if the function completed successfully.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;dev&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GameServer&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;gameserver&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color:#000&#34;&gt;grpc&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Status&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GameServer&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;gameserver&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ok&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;())&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{...}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To get &lt;a href=&#34;/site/site/docs/guides/client-sdks/#watchgameserver-function-gameserver&#34;&gt;updates on the backing &lt;code&gt;GameServer&lt;/code&gt;&lt;/a&gt; as they happen,
call &lt;code&gt;sdk-&amp;gt;WatchGameServer([](const agones::dev::sdk::GameServer&amp;amp; gameserver){...})&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This will call the passed in &lt;code&gt;std::function&lt;/code&gt;
synchronously (this is a blocking function, so you may want to run it in its own thread) whenever the backing &lt;code&gt;GameServer&lt;/code&gt;
is updated.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WatchGameServer&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;([](&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;dev&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GameServer&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;gameserver&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;){&lt;/span&gt;
  &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;cout&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;GameServer Update:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;                                 &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;//
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;\t&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;name: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;gameserver&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;object_meta&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;().&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;//
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;\t&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;state: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;gameserver&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;().&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;
            &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;flush&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For more information, you can also read the &lt;a href=&#34;/site/site/docs/guides/client-sdks/&#34;&gt;SDK Overview&lt;/a&gt;, check out

&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/sdks/cpp/include/agones/sdk.h&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;sdk.h&lt;/a&gt;
 and also look at the

&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/cpp-simple&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;C++ example&lt;/a&gt;
.&lt;/p&gt;

&lt;h3 id=&#34;failure&#34;&gt;Failure&lt;/h3&gt;

&lt;p&gt;When running on Agones, the above functions should only fail under exceptional circumstances, so please
file a bug if it occurs.&lt;/p&gt;

&lt;h3 id=&#34;building-the-libraries-from-source&#34;&gt;Building the Libraries from source&lt;/h3&gt;

&lt;p&gt;CMake is used to build SDK for all supported platforms (Linux/Window/MacOS).&lt;/p&gt;

&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CMake &amp;gt;= 3.13.0&lt;/li&gt;
&lt;li&gt;Git&lt;/li&gt;
&lt;li&gt;C++14 compiler&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agones SDK depends on &lt;a href=&#34;https://github.com/grpc/grpc/blob/master/BUILDING.md&#34;&gt;gRPC&lt;/a&gt;. If CMake cannot find gRPC with find_package(), it downloads and builds gRPC.
There are some extra prerequisites for OpenSSL on Windows, see &lt;a href=&#34;https://github.com/openssl/openssl/blob/master/NOTES.WIN&#34;&gt;documentation&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Perl&lt;/li&gt;
&lt;li&gt;NASM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that OpenSSL is not used in Agones SDK, but it is required to have full successfull build of gRPC.&lt;/p&gt;

&lt;h2 id=&#34;options&#34;&gt;Options&lt;/h2&gt;

&lt;p&gt;Following options are available:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AGONES_THIRDPARTY_INSTALL_PATH&lt;/strong&gt; (default is CMAKE_INSTALL_PREFIX) - installation path for Agones prerequisites (used only if gRPC and Protobuf are not found by find_package)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AGONES_ZLIB_STATIC&lt;/strong&gt; (default is ON) - use static version of zlib for gRPC&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(Windows only):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AGONES_BUILD_THIRDPARTY_DEBUG&lt;/strong&gt; (default is OFF) - build both debug and release versions of SDK&amp;rsquo;s prerequisites. Option is not used if you already have built gRPC.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AGONES_OPENSSL_CONFIG_STRING&lt;/strong&gt; (default is VC-WIN64A) - arguments to configure OpenSSL build (&lt;a href=&#34;https://github.com/openssl/openssl/blob/master/INSTALL.md&#34;&gt;documentation&lt;/a&gt;). Used only if OpenSSL and gRPC is built by Agones.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;linux-macos&#34;&gt;Linux / MacOS&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;mkdir -p .build
cd .build
cmake .. -DCMAKE_BUILD_TYPE=Release -G &amp;quot;Unix Makefiles&amp;quot; -DCMAKE_INSTALL_PREFIX=./install
cmake --build . --target install
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;windows&#34;&gt;Windows&lt;/h2&gt;

&lt;p&gt;Building with Visual Studio:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;md .build
cd .build
cmake .. -G &amp;quot;Visual Studio 15 2017 Win64&amp;quot; -DCMAKE_INSTALL_PREFIX=./install
cmake --build . --config Release --target install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Building with NMake&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;md .build
cd .build
cmake .. -G &amp;quot;NMake Makefiles&amp;quot; -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./install
cmake --build . --target install
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;remarks&#34;&gt;Remarks&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;CMAKE_INSTALL_PREFIX&lt;/strong&gt; may be skipped if it is OK to install Agones SDK to a default location (usually /usr/local or c:/Program Files/Agones).&lt;/p&gt;

&lt;p&gt;CMake option &lt;code&gt;-Wno-dev&lt;/code&gt; is specified to suppress &lt;a href=&#34;https://cmake.org/cmake/help/v3.13/policy/CMP0048.html&#34;&gt;CMP0048&lt;/a&gt; deprecation warning for gRPC build.&lt;/p&gt;

&lt;p&gt;If &lt;strong&gt;AGONES_ZLIB_STATIC&lt;/strong&gt; is set to OFF, ensure that you have installed zlib. For Windows it&amp;rsquo;s enough to copy zlib.dll near to gameserver executable. For Linux/Mac usually no actions are needed.&lt;/p&gt;

&lt;h3 id=&#34;using-sdk&#34;&gt;Using SDK&lt;/h3&gt;

&lt;p&gt;In CMake-based projects it&amp;rsquo;s enough to specify a folder where SDK is installed with &lt;code&gt;CMAKE_PREFIX_PATH&lt;/code&gt; and use &lt;code&gt;find_package(agones CONFIG REQUIRED)&lt;/code&gt; command. For example: 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/cpp-simple&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;cpp-simple&lt;/a&gt;
.
It may be useful to disable some &lt;a href=&#34;https://github.com/protocolbuffers/protobuf/blob/master/cmake/README.md#notes-on-compiler-warnings&#34;&gt;protobuf warnings&lt;/a&gt; in your project.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Quickstart: Create a Game Server Fleet</title>
      <link>/site/docs/getting-started/create-fleet/</link>
      <pubDate>Wed, 02 Jan 2019 06:42:20 +0000</pubDate>
      
      <guid>/site/docs/getting-started/create-fleet/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;

&lt;p&gt;The following prerequisites are required to create a GameServer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A Kubernetes cluster with the UDP port range 7000-8000 open on each node.&lt;/li&gt;
&lt;li&gt;Agones controller installed in the targeted cluster&lt;/li&gt;
&lt;li&gt;kubectl properly configured&lt;/li&gt;
&lt;li&gt;Netcat which is already installed on most Linux/macOS distributions, for windows you can use &lt;a href=&#34;https://docs.microsoft.com/en-us/windows/wsl/install-win10&#34;&gt;WSL&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you don&amp;rsquo;t have a Kubernetes cluster you can follow &lt;a href=&#34;/site/site/docs/installation/&#34;&gt;these instructions&lt;/a&gt; to create a cluster on Google Kubernetes Engine (GKE), Minikube or Azure Kubernetes Service (AKS), and install Agones.&lt;/p&gt;

&lt;p&gt;For the purpose of this guide we&amp;rsquo;re going to use the 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/simple-udp/&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;simple-udp&lt;/a&gt;
 example as the GameServer container. This example is a very simple UDP server written in Go. Don&amp;rsquo;t hesitate to look at the code of this example for more information.&lt;/p&gt;

&lt;p&gt;While not required, you may wish to go through the &lt;a href=&#34;/site/site/docs/getting-started/create-gameserver/&#34;&gt;Create a Game Server&lt;/a&gt; quickstart before this one.&lt;/p&gt;

&lt;h2 id=&#34;objectives&#34;&gt;Objectives&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create a Fleet in Kubernetes using Agones custom resource.&lt;/li&gt;
&lt;li&gt;Scale the Fleet up from its initial configuration.&lt;/li&gt;
&lt;li&gt;Request a GameServer allocation from the Fleet to play on.&lt;/li&gt;
&lt;li&gt;Connect to the allocated GameServer.&lt;/li&gt;
&lt;li&gt;Deploy a new GameServer configuration to the Fleet&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;1-create-a-fleet&#34;&gt;1. Create a Fleet&lt;/h3&gt;

&lt;p&gt;Let&amp;rsquo;s create a Fleet using the following command :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/simple-udp/fleet.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You should see a successful output similar to this :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;fleet &amp;quot;simple-udp&amp;quot; created
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This has created a Fleet record inside Kubernetes, which in turn creates two warm &lt;a href=&#34;/site/site/docs/reference/gameserver/&#34;&gt;GameServers&lt;/a&gt;
that are available to be allocated for a game session.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl get fleet
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It should look something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NAME         SCHEDULING   DESIRED   CURRENT   ALLOCATED   READY     AGE
simple-udp   Packed       2         3         0           2         9m
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can also see the GameServers that have been created by the Fleet by running &lt;code&gt;kubectl get gameservers&lt;/code&gt;,
the GameServer will be prefixed by &lt;code&gt;simple-udp&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NAME                     STATE     ADDRESS            PORT   NODE      AGE
simple-udp-llg4x-rx6rc   Ready     192.168.122.205    7752   minikube   9m
simple-udp-llg4x-v6g2r   Ready     192.168.122.205    7623   minikube   9m
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For the full details of the YAML file head to the &lt;a href=&#34;/site/site/docs/reference/fleet/&#34;&gt;Fleet Specification Guide&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&#34;2-fetch-the-fleet-status&#34;&gt;2. Fetch the Fleet status&lt;/h3&gt;

&lt;p&gt;Let&amp;rsquo;s wait for the two &lt;code&gt;GameServers&lt;/code&gt; to become ready.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;watch kubectl describe fleet simple-udp
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;Name:         simple-udp
Namespace:    default
Labels:       &amp;lt;none&amp;gt;
Annotations:  kubectl.kubernetes.io/last-applied-configuration={&amp;quot;apiVersion&amp;quot;:&amp;quot;agones.dev/v1&amp;quot;,&amp;quot;kind&amp;quot;:&amp;quot;Fleet&amp;quot;,&amp;quot;metadata&amp;quot;:{&amp;quot;annotations&amp;quot;:{},&amp;quot;name&amp;quot;:&amp;quot;simple-udp&amp;quot;,&amp;quot;namespace&amp;quot;:&amp;quot;default&amp;quot;},&amp;quot;spec&amp;quot;:{&amp;quot;replicas&amp;quot;:2,...
API Version:  agones.dev/v1
Kind:         Fleet
Metadata:
  Cluster Name:
  Creation Timestamp:  2018-07-01T18:55:35Z
  Generation:          1
  Resource Version:    24685
  Self Link:           /apis/agones.dev/v1/namespaces/default/fleets/simple-udp
  UID:                 56710a91-7d60-11e8-b2dd-08002703ef08
Spec:
  Replicas:  2
  Strategy:
    Rolling Update:
      Max Surge:        25%
      Max Unavailable:  25%
    Type:               RollingUpdate
  Template:
    Metadata:
      Creation Timestamp:  &amp;lt;nil&amp;gt;
    Spec:
      Health:
      Ports:
        Container Port:  7654
        Name:            default
        Port Policy:     Dynamic
      Template:
        Metadata:
          Creation Timestamp:  &amp;lt;nil&amp;gt;
        Spec:
          Containers:
            Image:  gcr.io/agones-images/udp-server:0.21
            Name:   simple-udp
            Resources:
Status:
  Allocated Replicas:  0
  Ready Replicas:      2
  Replicas:            2
Events:
  Type    Reason                 Age   From              Message
  ----    ------                 ----  ----              -------
  Normal  CreatingGameServerSet  13s   fleet-controller  Created GameServerSet simple-udp-wlqnd
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you look towards the bottom, you can see there is a section of &lt;code&gt;Status &amp;gt; Ready Replicas&lt;/code&gt; which will tell you
how many &lt;code&gt;GameServers&lt;/code&gt; are currently in a Ready state. After a short period, there should be 2 &lt;code&gt;Ready Replicas&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&#34;3-scale-up-the-fleet&#34;&gt;3. Scale up the Fleet&lt;/h3&gt;

&lt;p&gt;Let&amp;rsquo;s scale up the &lt;code&gt;Fleet&lt;/code&gt; from 2 &lt;code&gt;replicates&lt;/code&gt; to 5.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;kubectl scale fleet simple-udp --replicas=5&lt;/code&gt; to change Replicas count from 2 to 5.&lt;/p&gt;

&lt;p&gt;If we now run &lt;code&gt;kubectl get gameservers&lt;/code&gt; we should see 5 &lt;code&gt;GameServers&lt;/code&gt; prefixed by &lt;code&gt;simple-udp&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NAME                     STATE    ADDRESS           PORT    NODE       AGE
simple-udp-sdhzn-kcmh6   Ready    192.168.122.205   7191    minikube   52m
simple-udp-sdhzn-pdpk5   Ready    192.168.122.205   7752    minikube   53m
simple-udp-sdhzn-r4d6x   Ready    192.168.122.205   7623    minikube   52m
simple-udp-sdhzn-wng5k   Ready    192.168.122.205   7709    minikube   53m
simple-udp-sdhzn-wnhsw   Ready    192.168.122.205   7478    minikube   52m
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;4-allocate-a-game-server-from-the-fleet&#34;&gt;4. Allocate a Game Server from the Fleet&lt;/h3&gt;

&lt;p&gt;Since we have a fleet of warm gameservers, we need a way to request one of them for usage, and mark that it has
players access it (and therefore, it should not be deleted until they are finished with it).&lt;/p&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
In production, you would likely do the following through a &lt;a href=&#34;/site/site/docs/guides/access-api/&#34;&gt;Kubernetes API call&lt;/a&gt;, but we can also
do this through &lt;code&gt;kubectl&lt;/code&gt; as well, and ask it to return the response in yaml so that we can see what has happened.
&lt;/div&gt;


&lt;p&gt;We can do the allocation of a GameServer for usage through a &lt;code&gt;GameServerAllocation&lt;/code&gt;, which will both
return to us the details of a &lt;code&gt;GameServer&lt;/code&gt; (assuming one is available), and also move it to the &lt;code&gt;Allocated&lt;/code&gt; state,
which demarcates that it has players on it, and should not be removed until &lt;code&gt;SDK.Shutdown()&lt;/code&gt; is called, or it is manually deleted.&lt;/p&gt;

&lt;p&gt;It is worth noting that there is nothing specific that ties a &lt;code&gt;GameServerAllocation&lt;/code&gt; to a fleet.
A &lt;code&gt;GameServerAllocation&lt;/code&gt; uses a &lt;a href=&#34;https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/&#34;&gt;label selector&lt;/a&gt;
to determine what group of &lt;code&gt;GameServers&lt;/code&gt; it will attempt to allocate out of. That being said, a &lt;code&gt;Fleet&lt;/code&gt; and &lt;code&gt;GameServerAllocation&lt;/code&gt;
are often used in conjunction.&lt;/p&gt;

&lt;p&gt;
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//examples/simple-udp/gameserverallocation.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;This example&lt;/a&gt;
 uses the label selector to specifically target the &lt;code&gt;simple-udp&lt;/code&gt; fleet that we just created.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/simple-udp/gameserverallocation.yaml -o yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For the full details of the YAML file head to the &lt;a href=&#34;/site/site/docs/reference/gameserverallocation/&#34;&gt;GameServerAllocation Specification Guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should get back a response that looks like the following:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;apiVersion&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;allocation.agones.dev/v1&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;kind&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;GameServerAllocation&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;metadata&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;creationTimestamp&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;2019-02-19T02:13:12Z&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;simple-udp-dph9b-hfk24&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;namespace&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;default&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;metadata&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;{}&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;required&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;matchLabels&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;agones.dev/fleet&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;simple-udp&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;scheduling&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;Packed&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;status&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;address&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;192.168.122.152&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;gameServerName&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;simple-udp-dph9b-hfk24&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;nodeName&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;minikube&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;ports&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;default&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;port&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;7714&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;state&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;Allocated&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you look at the &lt;code&gt;status&lt;/code&gt; section, there are several things to take note of. The &lt;code&gt;state&lt;/code&gt; value will tell if
a &lt;code&gt;GameServer&lt;/code&gt; was allocated or not. If a &lt;code&gt;GameServer&lt;/code&gt; could not be found, this will be set to &lt;code&gt;UnAllocated&lt;/code&gt;.
If there are too many concurrent requests overwhelmed the system, &lt;code&gt;state&lt;/code&gt; will be set to
&lt;code&gt;Contention&lt;/code&gt; even though there are available &lt;code&gt;GameServers&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;However, we see that the &lt;code&gt;status.state&lt;/code&gt; value was set to &lt;code&gt;Allocated&lt;/code&gt;.
This means you have been successfully allocated a &lt;code&gt;GameServer&lt;/code&gt; out of the fleet, and you can now connect your players to it!&lt;/p&gt;

&lt;p&gt;You can see various immutable details of the &lt;code&gt;GameServer&lt;/code&gt; in the status - the &lt;code&gt;address&lt;/code&gt;, &lt;code&gt;ports&lt;/code&gt; and the name
of the &lt;code&gt;GameServer&lt;/code&gt;, in case you want to use it to retrieve more details.&lt;/p&gt;

&lt;p&gt;We can also check to see how many &lt;code&gt;GameServers&lt;/code&gt; you have &lt;code&gt;Allocated&lt;/code&gt; vs &lt;code&gt;Ready&lt;/code&gt; with the following command
(&amp;ldquo;gs&amp;rdquo; is shorthand for &amp;ldquo;gameserver&amp;rdquo;).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl get gs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will get you a list of all the current &lt;code&gt;GameServers&lt;/code&gt; and their &lt;code&gt;Status.State&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NAME                     STATE       ADDRESS           PORT   NODE      AGE
simple-udp-sdhzn-kcmh6   Ready       192.168.122.205   7191   minikube  52m
simple-udp-sdhzn-pdpk5   Ready       192.168.122.205   7752   minikube  53m
simple-udp-sdhzn-r4d6x   Allocated   192.168.122.205   7623   minikube  52m
simple-udp-sdhzn-wng5k   Ready       192.168.122.205   7709   minikube  53m
simple-udp-sdhzn-wnhsw   Ready       192.168.122.205   7478   minikube  52m
&lt;/code&gt;&lt;/pre&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
&lt;code&gt;GameServerAllocations&lt;/code&gt; are create only and not stored for performance reasons, so you won&amp;rsquo;t be able to list
  them after they have been created - but you can see their effects on &lt;code&gt;GameServers&lt;/code&gt;
&lt;/div&gt;


&lt;p&gt;A handy trick for checking to see how many &lt;code&gt;GameServers&lt;/code&gt; you have &lt;code&gt;Allocated&lt;/code&gt; vs &lt;code&gt;Ready&lt;/code&gt;, run the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl get gs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will get you a list of all the current &lt;code&gt;GameServers&lt;/code&gt; and their &lt;code&gt;Status &amp;gt; State&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NAME                     STATE       ADDRESS          PORT   NODE        AGE
simple-udp-tfqn7-c9tqz   Ready       192.168.39.150   7136   minikube    52m
simple-udp-tfqn7-g8fhq   Allocated   192.168.39.150   7148   minikube    53m
simple-udp-tfqn7-p8wnl   Ready       192.168.39.150   7453   minikube    52m
simple-udp-tfqn7-t6bwp   Ready       192.168.39.150   7228   minikube    53m
simple-udp-tfqn7-wkb7b   Ready       192.168.39.150   7226   minikube    52m
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;5-scale-down-the-fleet&#34;&gt;5. Scale down the Fleet&lt;/h3&gt;

&lt;p&gt;Not only can we scale our fleet up, but we can scale it down as well.&lt;/p&gt;

&lt;p&gt;The nice thing about Agones is that it is smart enough to know when &lt;code&gt;GameServers&lt;/code&gt; have been moved to &lt;code&gt;Allocated&lt;/code&gt;
and will automatically leave them running on scale down &amp;ndash; as we assume that players are playing on this game server,
and we shouldn&amp;rsquo;t disconnect them!&lt;/p&gt;

&lt;p&gt;Let&amp;rsquo;s scale down our Fleet to 0 (yep! you can do that!), and watch what happens.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;kubectl scale fleet simple-udp --replicas=0&lt;/code&gt; to change Replicas count from 5 to 0.&lt;/p&gt;

&lt;p&gt;It may take a moment for all the &lt;code&gt;GameServers&lt;/code&gt; to shut down, so let&amp;rsquo;s watch them all and see what happens:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;watch kubectl get gs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Eventually, one by one they will be removed from the list, and you should simply see:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NAME                     STATUS      ADDRESS          PORT    NODE       AGE
simple-udp-tfqn7-g8fhq   Allocated   192.168.39.150   7148    minikube   55m
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That lone &lt;code&gt;Allocated&lt;/code&gt; &lt;code&gt;GameServer&lt;/code&gt; is left all alone, but still running!&lt;/p&gt;

&lt;p&gt;If you would like, try editing the &lt;code&gt;Fleet&lt;/code&gt; configuration &lt;code&gt;replicas&lt;/code&gt; field and watch the list of &lt;code&gt;GameServers&lt;/code&gt;
grow and shrink.&lt;/p&gt;

&lt;h3 id=&#34;6-connect-to-the-gameserver&#34;&gt;6. Connect to the GameServer&lt;/h3&gt;

&lt;p&gt;Since we&amp;rsquo;ve only got one allocation, we&amp;rsquo;ll just grab the details of the IP and port of the
only allocated &lt;code&gt;GameServer&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl get gameservers | grep Allocated | awk &#39;{print $3&amp;quot;:&amp;quot;$4 }&#39;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This should output your Game Server IP address and port. (eg &lt;code&gt;10.130.65.208:7936&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;You can now communicate with the &lt;code&gt;GameServer&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nc -u {IP} {PORT}
Hello World !
ACK: Hello World !
EXIT
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can finally type &lt;code&gt;EXIT&lt;/code&gt; which tells the SDK to run the &lt;a href=&#34;/site/site/docs/guides/client-sdks/#shutdown&#34;&gt;Shutdown command&lt;/a&gt;, and therefore shuts down the &lt;code&gt;GameServer&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you run &lt;code&gt;kubectl describe gs | grep State&lt;/code&gt; again - either the GameServer will be replaced with a new, &lt;code&gt;Ready&lt;/code&gt; &lt;code&gt;GameServer&lt;/code&gt;
, or it will be in &lt;code&gt;Shutdown&lt;/code&gt; state, on the way to being deleted.&lt;/p&gt;

&lt;p&gt;Since we are running a &lt;code&gt;Fleet&lt;/code&gt;, Agones will always do it&amp;rsquo;s best to ensure there are always the configured number
of &lt;code&gt;GameServers&lt;/code&gt; in the pool in either a &lt;code&gt;Ready&lt;/code&gt; or &lt;code&gt;Allocated&lt;/code&gt; state.&lt;/p&gt;

&lt;h3 id=&#34;7-deploy-a-new-version-of-the-gameserver-on-the-fleet&#34;&gt;7. Deploy a new version of the GameServer on the Fleet&lt;/h3&gt;

&lt;p&gt;We can also change the configuration of the &lt;code&gt;GameServer&lt;/code&gt; of the running &lt;code&gt;Fleet&lt;/code&gt;, and have the changes
roll out, without interrupting the currently &lt;code&gt;Allocated&lt;/code&gt; &lt;code&gt;GameServers&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let&amp;rsquo;s take this for a spin! Run &lt;code&gt;kubectl scale fleet simple-udp --replicas=5&lt;/code&gt; to return Replicas count back to 5.&lt;/p&gt;

&lt;p&gt;Let&amp;rsquo;s also allocate ourselves a &lt;code&gt;GameServer&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/simple-udp/gameserverallocation.yaml -o yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We should now have four &lt;code&gt;Ready&lt;/code&gt; &lt;code&gt;GameServers&lt;/code&gt; and one &lt;code&gt;Allocated&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We can check this by running &lt;code&gt;kubectl get gs&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NAME                     STATE       ADDRESS          PORT   NODE       AGE 
simple-udp-tfqn7-c9tz7   Ready       192.168.39.150   7136   minikube   5m       
simple-udp-tfqn7-g8fhq   Allocated   192.168.39.150   7148   minikube   5m   
simple-udp-tfqn7-n0wnl   Ready       192.168.39.150   7453   minikube   5m   
simple-udp-tfqn7-hiiwp   Ready       192.168.39.150   7228   minikube   5m   
simple-udp-tfqn7-w8z7b   Ready       192.168.39.150   7226   minikube   5m   
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In production, we&amp;rsquo;d likely be changing a &lt;code&gt;containers &amp;gt; image&lt;/code&gt; configuration to update our &lt;code&gt;Fleet&lt;/code&gt;
to run a new game server process, but to make this example simple, change &lt;code&gt;containerPort&lt;/code&gt; from &lt;code&gt;7654&lt;/code&gt;
to &lt;code&gt;6000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;kubectl edit fleet simple-udp&lt;/code&gt;, and make the necessary changes, and then save and exit your editor.&lt;/p&gt;

&lt;p&gt;This will start the deployment of a new set of &lt;code&gt;GameServers&lt;/code&gt; running
with a Container Port of &lt;code&gt;6000&lt;/code&gt;.&lt;/p&gt;



&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Warning&lt;/h4&gt;
This will make it such that you can no longer connect to the simple-udp game server.
&lt;/div&gt;


&lt;p&gt;Run &lt;code&gt;watch kubectl get gs&lt;/code&gt;
until you can see that there is
one with a containerPort of &lt;code&gt;7654&lt;/code&gt;, which is the &lt;code&gt;Allocated&lt;/code&gt; &lt;code&gt;GameServer&lt;/code&gt;, and four instances with a containerPort of &lt;code&gt;6000&lt;/code&gt; which
is the new configuration.&lt;/p&gt;

&lt;p&gt;You have now deployed a new version of your game!&lt;/p&gt;

&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Have a look at the &lt;a href=&#34;/site/site/docs/reference/gameserverallocation/&#34;&gt;GameServerAllocation specification&lt;/a&gt;, and see
how the extra functionality can enable smoke testing, server information communication, and more.&lt;/li&gt;
&lt;li&gt;You can now create a fleet autoscaler to automatically resize your fleet based on the actual usage.
See &lt;a href=&#34;/site/site/docs/getting-started/create-fleetautoscaler/&#34;&gt;Create a Fleet Autoscaler&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Have a look at the &lt;a href=&#34;/site/site/docs/guides/gameserver-lifecycle/&#34;&gt;GameServer Creation, Allocation and Shutdown Lifecycle&lt;/a&gt; diagram,
to give you a good overview of how all the pieces fit together - from creating to integrating with a matchmaker.&lt;/li&gt;
&lt;li&gt;Or if you want to try to use your own GameServer container make sure you have properly integrated the &lt;a href=&#34;/site/site/docs/guides/client-sdks/&#34;&gt;Agones SDK&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If you would like to learn how to programmatically allocate a Game Server from the fleet, see how to &lt;a href=&#34;/site/site/docs/guides/access-api/&#34;&gt;Access Agones via the Kubernetes API&lt;/a&gt; or alternatively use the &lt;a href=&#34;/site/site/docs/advanced/allocator-service/&#34;&gt;Allocator Service&lt;/a&gt;, depending on your needs.&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Amazon Elastic Kubernetes Service</title>
      <link>/site/docs/installation/creating-cluster/eks/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/site/docs/installation/creating-cluster/eks/</guid>
      <description>
        
        
        

&lt;p&gt;Create your EKS Cluster using the &lt;a href=&#34;https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html&#34;&gt;Getting Started Guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Possible steps are the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create new IAM role for cluster management.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;aws configure&lt;/code&gt; to authorize your &lt;code&gt;awscli&lt;/code&gt; with proper &lt;code&gt;AWS Access Key ID&lt;/code&gt; and &lt;code&gt;AWS Secret Access Key&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Create an example cluster:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;eksctl create cluster \
--name prod \
--version 1.15 \
--nodegroup-name standard-workers \
--node-type t3.medium \
--nodes 3 \
--nodes-min 3 \
--nodes-max 4 \
--node-ami auto
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
EKS does not use the normal Kubernetes networking since it is &lt;a href=&#34;https://www.contino.io/insights/kubernetes-is-hard-why-eks-makes-it-easier-for-network-and-security-architects&#34;&gt;incompatible with Amazon VPC networking&lt;/a&gt;.
&lt;/div&gt;


&lt;h2 id=&#34;allowing-udp-traffic&#34;&gt;Allowing UDP Traffic&lt;/h2&gt;

&lt;p&gt;For Agones to work correctly, we need to allow UDP traffic to pass through to our EKS cluster worker nodes. To achieve this, we must update the workers&amp;rsquo; nodepool SG (Security Group) with the proper rule. A simple way to do that is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Log in to the AWS Management Console&lt;/li&gt;
&lt;li&gt;Go to the VPC Dashboard and select &lt;strong&gt;Security Groups&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Find the Security Group for the workers nodepool, which will be named something like &lt;code&gt;eksctl-[cluster-name]-nodegroup-[cluster-name]-workers/SG&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Inbound Rules&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Edit Rules&lt;/strong&gt; to add a new &lt;strong&gt;Custom UDP Rule&lt;/strong&gt; with a 7000-8000 port range and an appropriate &lt;strong&gt;Source&lt;/strong&gt; CIDR range (&lt;code&gt;0.0.0.0/0&lt;/code&gt; allows all traffic)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Continue to &lt;a href=&#34;/site/site/docs/installation/install-agones/&#34;&gt;Install Agones&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Installing Agones on Azure Kubernetes Service using Terraform</title>
      <link>/site/docs/installation/terraform/aks/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/site/docs/installation/terraform/aks/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;/h2&gt;

&lt;p&gt;Install &lt;code&gt;az&lt;/code&gt; utility by following &lt;a href=&#34;https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest&#34;&gt;these instructions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The example of AKS submodule configuration could be found here:
 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/terraform-submodules/aks/module.tf&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Terraform configuration with Agones submodule&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Copy &lt;code&gt;module.tf&lt;/code&gt; file into a separate folder.&lt;/p&gt;

&lt;p&gt;Log in to Azure CLI:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;az login
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Configure your terraform:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;terraform init
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now you can deploy your cluster (use variables from the above &lt;code&gt;az ad sp create-for-rbac&lt;/code&gt; command output):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;terraform apply -var client_id=&amp;quot;&amp;lt;appId&amp;gt;&amp;quot; -var client_secret=&amp;quot;&amp;lt;password&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Once you created all resources on AKS you can get the credentials so that you can use &lt;code&gt;kubectl&lt;/code&gt; to configure your cluster:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;az aks get-credentials --resource-group agonesRG --name test-cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Check that you have access to the Kubernetes cluster:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl get nodes
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Configurable parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;log_level - possible values: Fatal, Error, Warn, Info, Debug (default is &amp;ldquo;info&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;cluster_name - the name of the AKS cluster (default is &amp;ldquo;agones-terraform-example&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;agones_version - the version of agones to install (an empty string, which is the default, is the latest version from the &lt;a href=&#34;https://agones.dev/chart/stable&#34;&gt;Helm repository&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;machine_type - node machine type for hosting game servers (default is &amp;ldquo;Standard_D2_v2&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;disk_size - disk size of the node&lt;/li&gt;
&lt;li&gt;region - the location of the cluster&lt;/li&gt;
&lt;li&gt;node_count - count of game server nodes for the default node pool (default is &amp;ldquo;4&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;feature_gates - a list of alpha and beta version features to enable. For example, &amp;ldquo;PlayerTracking=true&amp;amp;ContainerPortAllocation=true&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;uninstall-the-agones-and-delete-aks-cluster&#34;&gt;Uninstall the Agones and delete AKS cluster&lt;/h2&gt;

&lt;p&gt;Run next command to delete all Terraform provisioned resources:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;terraform destroy
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;reference&#34;&gt;Reference&lt;/h2&gt;

&lt;p&gt;Details on how you can authenticate your AKS terraform provider using official &lt;a href=&#34;https://www.terraform.io/docs/providers/azurerm/auth/service_principal_client_secret.html&#34;&gt;instructions&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/site/site/docs/installation/confirm/&#34;&gt;Confirm Agones is up and running&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Install Agones using Helm</title>
      <link>/site/docs/installation/install-agones/helm/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/site/docs/installation/install-agones/helm/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.helm.sh/helm/&#34;&gt;Helm&lt;/a&gt; package manager 2.10.0+&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/site/site/docs/installation/#usage-requirements&#34;&gt;Supported Kubernetes Cluster&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;installing-the-chart&#34;&gt;Installing the Chart&lt;/h2&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
If you don&amp;rsquo;t have &lt;code&gt;Helm&lt;/code&gt; installed locally, or &lt;code&gt;Tiller&lt;/code&gt; installed in your Kubernetes cluster, read the &lt;a href=&#34;https://docs.helm.sh/using_helm/&#34;&gt;Using Helm&lt;/a&gt; documentation to get started.
&lt;/div&gt;


&lt;p&gt;To install the chart with the release name &lt;code&gt;my-release&lt;/code&gt; using our stable helm repository:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ helm repo add agones https://agones.dev/chart/stable
$ helm install --name my-release --namespace agones-system agones/agones&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;We recommend to install Agones in its own namespaces (like &lt;code&gt;agones-system&lt;/code&gt; as shown above)
you can use the helm &lt;code&gt;--namespace&lt;/code&gt; parameter to specify a different namespace.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When running in production, Agones should be scheduled on a dedicated pool of nodes, distinct from where Game Servers are scheduled for better isolation and resiliency. By default Agones prefers to be scheduled on nodes labeled with &lt;code&gt;agones.dev/agones-system=true&lt;/code&gt; and tolerates node taint &lt;code&gt;agones.dev/agones-system=true:NoExecute&lt;/code&gt;. If no dedicated nodes are available, Agones will
run on regular nodes, but that&amp;rsquo;s not recommended for production use. For instructions on setting up a dedicated node
pool for Agones, see the &lt;a href=&#34;/site/site/docs/installation/&#34;&gt;Agones installation instructions&lt;/a&gt; for your preferred environment.&lt;/p&gt;

&lt;p&gt;The command deploys Agones on the Kubernetes cluster with the default configuration. The &lt;a href=&#34;#configuration&#34;&gt;configuration&lt;/a&gt; section lists the parameters that can be configured during installation.&lt;/p&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Tip&lt;/h4&gt;
List all releases using &lt;code&gt;helm list&lt;/code&gt;
&lt;/div&gt;




&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
If you are installing a development build of Agones (i.e. not the 1.7.0 release), you will need to install Agones the following way:
&lt;/div&gt;

&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ &lt;span style=&#34;color:#204a87&#34;&gt;cd&lt;/span&gt; install/helm/
$ helm install --name my-release --namespace agones-system agones --set agones.image.tag&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;1.7.0-481970d&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;where 481970d - is a short hash of the latest commit.&lt;/p&gt;

&lt;p&gt;The full list of available tags is &lt;a href=&#34;https://console.cloud.google.com/gcr/images/agones-images/&#34;&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&#34;namespaces&#34;&gt;Namespaces&lt;/h2&gt;

&lt;p&gt;By default Agones is configured to work with game servers deployed in the &lt;code&gt;default&lt;/code&gt; namespace. If you are planning to use another namespace you can configure Agones via the parameter &lt;code&gt;gameservers.namespaces&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For example to use &lt;code&gt;default&lt;/code&gt; &lt;strong&gt;and&lt;/strong&gt; &lt;code&gt;xbox&lt;/code&gt; namespaces:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl create namespace xbox
$ helm install --set &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;gameservers.namespaces={default,xbox}&amp;#34;&lt;/span&gt; --namespace agones-system --name my-release agones/agones&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
You need to create your namespaces before installing Agones.
&lt;/div&gt;


&lt;p&gt;If you want to add a new namespace afterward simply upgrade your release:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl create namespace ps4
$ helm upgrade --set &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;gameservers.namespaces={default,xbox,ps4}&amp;#34;&lt;/span&gt; my-release agones/agones&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;rbac&#34;&gt;RBAC&lt;/h2&gt;

&lt;p&gt;By default, &lt;code&gt;agones.rbacEnabled&lt;/code&gt; is set to true. This enables RBAC support in Agones and must be true if RBAC is enabled in your cluster.&lt;/p&gt;

&lt;p&gt;The chart will take care of creating the required service accounts and roles for Agones.&lt;/p&gt;

&lt;p&gt;If you have RBAC disabled, or to put it another way, ABAC enabled, you should set this value to &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&#34;uninstalling-the-chart&#34;&gt;Uninstalling the Chart&lt;/h2&gt;

&lt;p&gt;To uninstall/delete the &lt;code&gt;my-release&lt;/code&gt; deployment:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ helm delete my-release&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The command removes all the Kubernetes components associated with the chart and deletes the release.&lt;/p&gt;

&lt;h2 id=&#34;configuration&#34;&gt;Configuration&lt;/h2&gt;

&lt;p&gt;The following tables lists the configurable parameters of the Agones chart and their default values.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.rbacEnabled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Creates RBAC resources. Must be set for any cluster configured with RBAC&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.registerWebhooks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Registers the webhooks used for the admission controller&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.registerApiService&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Registers the apiservice(s) used for the Kubernetes API extension&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.registerServiceAccounts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Attempts to create service accounts for the controllers&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.createPriorityClass&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Attempts to create priority classes for the controllers&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.priorityClassName&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Name of the priority classes to create&lt;/td&gt;
&lt;td&gt;&lt;code&gt;agones-system&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.featureGates&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A URL query encoded string of Flags to enable/disable e.g. &lt;code&gt;Example=true&amp;amp;OtherThing=false&lt;/code&gt;. Any value accepted by &lt;a href=&#34;https://golang.org/pkg/strconv/#ParseBool&#34;&gt;strconv.ParseBool(string)&lt;/a&gt; can be used as a boolean value&lt;/td&gt;
&lt;td&gt;``&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.crds.install&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Install the CRDs with this chart. Useful to disable if you want to subchart (since crd-install hook is broken), so you can copy the CRDs into your own chart.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.crds.cleanupOnDelete&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run the pre-delete hook to delete all GameServers and their backing Pods when deleting the helm chart, so that all CRDs can be removed on chart deletion&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.metrics.prometheusServiceDiscovery&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Adds annotations for Prometheus ServiceDiscovery (and also Strackdriver)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.metrics.prometheusEnabled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enables controller metrics on port &lt;code&gt;8080&lt;/code&gt; and path &lt;code&gt;/metrics&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.metrics.stackdriverEnabled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enables Stackdriver exporter of controller metrics&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.metrics.stackdriverProjectID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;This overrides the default gcp project id for use with stackdriver&lt;/td&gt;
&lt;td&gt;``&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.metrics.stackdriverLabels&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A set of default labels to add to all stackdriver metrics generated in form of key value pair (&lt;code&gt;key=value,key2=value2&lt;/code&gt;). By default metadata are automatically added using Kubernetes API and GCP metadata enpoint.&lt;/td&gt;
&lt;td&gt;``&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.serviceaccount.controller&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Service account name for the controller&lt;/td&gt;
&lt;td&gt;&lt;code&gt;agones-controller&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.serviceaccount.sdk&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Service account name for the sdk&lt;/td&gt;
&lt;td&gt;&lt;code&gt;agones-sdk&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.image.registry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Global image registry for all images&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gcr.io/agones-images&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.image.tag&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Global image tag for all images&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1.7.0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.image.controller.name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Image name for the controller&lt;/td&gt;
&lt;td&gt;&lt;code&gt;agones-controller&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.image.controller.pullPolicy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Image pull policy for the controller&lt;/td&gt;
&lt;td&gt;&lt;code&gt;IfNotPresent&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.image.controller.pullSecret&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Image pull secret for the controller, allocator, sdk and ping image. Should be created both in &lt;code&gt;agones-system&lt;/code&gt; and &lt;code&gt;default&lt;/code&gt; namespaces&lt;/td&gt;
&lt;td&gt;``&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.image.sdk.name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Image name for the sdk&lt;/td&gt;
&lt;td&gt;&lt;code&gt;agones-sdk&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.image.sdk.tag&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Image tag for the sdk&lt;/td&gt;
&lt;td&gt;value of &lt;code&gt;agones.image.tag&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.image.sdk.cpuRequest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The &lt;a href=&#34;https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace/&#34;&gt;cpu request&lt;/a&gt; for sdk server container&lt;/td&gt;
&lt;td&gt;&lt;code&gt;30m&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.image.sdk.cpuLimit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The &lt;a href=&#34;https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace/&#34;&gt;cpu limit&lt;/a&gt; for the sdk server container&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt; (none)&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.image.sdk.memoryRequest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The &lt;a href=&#34;https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace/&#34;&gt;memory request&lt;/a&gt; for sdk server container&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt; (none)&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.image.sdk.memoryLimit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The &lt;a href=&#34;https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace/&#34;&gt;memory limit&lt;/a&gt; for the sdk server container&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt; (none)&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.image.sdk.alwaysPull&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tells if the sdk image should always be pulled&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.image.ping.name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Image name for the ping service&lt;/td&gt;
&lt;td&gt;&lt;code&gt;agones-ping&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.image.ping.tag&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Image tag for the ping service&lt;/td&gt;
&lt;td&gt;value of &lt;code&gt;agones.image.tag&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.image.ping.pullPolicy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Image pull policy for the ping service&lt;/td&gt;
&lt;td&gt;&lt;code&gt;IfNotPresent&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.controller.http.port&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Port to use for liveness probe service and metrics&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8080&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.controller.healthCheck.initialDelaySeconds&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Initial delay before performing the first probe (in seconds)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.controller.healthCheck.periodSeconds&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Seconds between every liveness probe (in seconds)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.controller.healthCheck.failureThreshold&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Number of times before giving up (in seconds)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.controller.healthCheck.timeoutSeconds&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Number of seconds after which the probe times out (in seconds)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.controller.resources&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Controller resource requests/limit&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.controller.generateTLS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set to true to generate TLS certificates or false to provide your own certificates in &lt;code&gt;certs/*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.controller.nodeSelector&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Controller &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector&#34;&gt;node labels&lt;/a&gt; for pod assignment&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.controller.tolerations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Controller &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/&#34;&gt;toleration&lt;/a&gt; labels for pod assignment&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.controller.affinity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Controller &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity&#34;&gt;affinity&lt;/a&gt; settings for pod assignment&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.controller.numWorkers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Number of workers to spin per resource type&lt;/td&gt;
&lt;td&gt;&lt;code&gt;64&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.controller.apiServerQPS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Maximum sustained queries per second that controller should be making against API Server&lt;/td&gt;
&lt;td&gt;&lt;code&gt;100&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.controller.apiServerQPSBurst&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Maximum burst queries per second that controller should be making against API Server&lt;/td&gt;
&lt;td&gt;&lt;code&gt;200&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.controller.logLevel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Agones Controller Log level. Log only entries with that severity and above&lt;/td&gt;
&lt;td&gt;&lt;code&gt;info&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.controller.persistentLogs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Store Agones controller logs in a temporary volume attached to a container for debugging&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.controller.persistentLogsSizeLimitMB&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Maximum total size of all Agones container logs in MB&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10000&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.ping.install&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Whether to install the &lt;a href=&#34;/site/site/docs/guides/ping-service/&#34;&gt;ping service&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.ping.replicas&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The number of replicas to run in the deployment&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.ping.http.expose&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Expose the http ping service via a Service&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.ping.http.response&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The string response returned from the http service&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ok&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.ping.http.port&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The port to expose on the service&lt;/td&gt;
&lt;td&gt;&lt;code&gt;80&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.ping.http.serviceType&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The &lt;a href=&#34;https://kubernetes.io/docs/concepts/services-networking/service/&#34;&gt;Service Type&lt;/a&gt; of the HTTP Service&lt;/td&gt;
&lt;td&gt;&lt;code&gt;LoadBalancer&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.ping.udp.expose&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Expose the udp ping service via a Service&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.ping.udp.rateLimit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Number of UDP packets the ping service handles per instance, per second, per sender&lt;/td&gt;
&lt;td&gt;&lt;code&gt;20&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.ping.udp.port&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The port to expose on the service&lt;/td&gt;
&lt;td&gt;&lt;code&gt;80&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.ping.udp.serviceType&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The &lt;a href=&#34;https://kubernetes.io/docs/concepts/services-networking/service/&#34;&gt;Service Type&lt;/a&gt; of the UDP Service&lt;/td&gt;
&lt;td&gt;&lt;code&gt;LoadBalancer&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.ping.healthCheck.initialDelaySeconds&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Initial delay before performing the first probe (in seconds)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.ping.healthCheck.periodSeconds&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Seconds between every liveness probe (in seconds)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.ping.healthCheck.failureThreshold&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Number of times before giving up (in seconds)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.ping.healthCheck.timeoutSeconds&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Number of seconds after which the probe times out (in seconds)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.ping.resources&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ping pods resource requests/limit&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.ping.nodeSelector&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ping &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector&#34;&gt;node labels&lt;/a&gt; for pod assignment&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.ping.tolerations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ping &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/&#34;&gt;toleration&lt;/a&gt; labels for pod assignment&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.ping.affinity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ping &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity&#34;&gt;affinity&lt;/a&gt; settings for pod assignment&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.allocator.install&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Whether to install the &lt;a href=&#34;/site/site/docs/advanced/allocator-service/&#34;&gt;allocator service&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.allocator.replicas&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The number of replicas to run in the deployment&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.allocator.http.port&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The port to expose on the service&lt;/td&gt;
&lt;td&gt;&lt;code&gt;443&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.allocator.http.serviceType&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The &lt;a href=&#34;https://kubernetes.io/docs/concepts/services-networking/service/&#34;&gt;Service Type&lt;/a&gt; of the HTTP Service&lt;/td&gt;
&lt;td&gt;&lt;code&gt;LoadBalancer&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.allocator.generateTLS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set to true to generate TLS certificates or false to provide certificates in &lt;code&gt;certs/allocator/*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.allocator.tolerations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Allocator &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/&#34;&gt;toleration&lt;/a&gt; labels for pod assignment&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agones.allocator.affinity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Allocator &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity&#34;&gt;affinity&lt;/a&gt; settings for pod assignment&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gameservers.namespaces&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;a list of namespaces you are planning to use to deploy game servers&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[&amp;quot;default&amp;quot;]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gameservers.minPort&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Minimum port to use for dynamic port allocation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;7000&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gameservers.maxPort&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Maximum port to use for dynamic port allocation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8000&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;New Configuration Features:&lt;/strong&gt;&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;helm.installTests&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Add an ability to run &lt;code&gt;helm test agones&lt;/code&gt; to verify the installation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8000&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Specify each parameter using the &lt;code&gt;--set key=value[,key=value]&lt;/code&gt; argument to &lt;code&gt;helm install&lt;/code&gt;. For example,&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ helm install --name my-release --namespace agones-system &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --set gameservers.minPort&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1000&lt;/span&gt;,gameservers.maxPort&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;5000&lt;/span&gt; agones&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The above command will deploy Agones controllers to &lt;code&gt;agones-system&lt;/code&gt; namespace. Additionally Agones will use a dynamic GameServers&amp;rsquo; port allocation range of 1000-5000.&lt;/p&gt;

&lt;p&gt;Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ helm install --name my-release --namespace agones-system -f values.yaml agones/agones&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Tip&lt;/h4&gt;
You can use the default
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/install/helm/agones/values.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;values.yaml&lt;/a&gt;
&lt;/div&gt;


&lt;h2 id=&#34;helm-test&#34;&gt;Helm test&lt;/h2&gt;

&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Tip&lt;/h4&gt;
In order to use &lt;code&gt;helm test&lt;/code&gt; command described in this section you need to set &lt;code&gt;helm.installTests&lt;/code&gt; helm parameter to &lt;code&gt;true&lt;/code&gt;.
&lt;/div&gt;

&lt;p&gt;Check the Agones installation by running the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ helm &lt;span style=&#34;color:#204a87&#34;&gt;test&lt;/span&gt; my-release --cleanup                     
RUNNING: agones-test
PASSED: agones-test&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This test would create a &lt;code&gt;GameServer&lt;/code&gt; resource and delete it afterwards.&lt;/p&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Tip&lt;/h4&gt;
&lt;p&gt;If you receive the following error:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;RUNNING: agones-test
ERROR: pods &amp;quot;agones-test&amp;quot; already exists
Error: 1 test(s) failed
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That mean that you skiped &lt;code&gt;--cleanup&lt;/code&gt; flag and you should either delete &lt;code&gt;agones-test&lt;/code&gt; pod manually or run with the same test &lt;code&gt;helm test my-release --cleanup&lt;/code&gt; two more times.&lt;/p&gt;

&lt;/div&gt;


&lt;h2 id=&#34;tls-certificates&#34;&gt;TLS Certificates&lt;/h2&gt;

&lt;p&gt;By default agones chart generates tls certificates used by the admission controller, while this is handy, it requires the agones controller to restart on each &lt;code&gt;helm upgrade&lt;/code&gt; command.
For most use cases the controller would have required a restart anyway (eg: controller image updated). However if you really need to avoid restarts we suggest that you turn off tls automatic generation (&lt;code&gt;agones.controller.generateTLS&lt;/code&gt; to &lt;code&gt;false&lt;/code&gt;) and provide your own certificates (&lt;code&gt;certs/server.crt&lt;/code&gt;,&lt;code&gt;certs/server.key&lt;/code&gt;).&lt;/p&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Tip&lt;/h4&gt;
You can use our script located at
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/install/helm/agones/certs/cert.sh&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;cert.sh&lt;/a&gt;
 to generate them.
&lt;/div&gt;


&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/site/site/docs/installation/confirm/&#34;&gt;Confirm Agones is up and running&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Player Tracking</title>
      <link>/site/docs/guides/player-tracking/</link>
      <pubDate>Tue, 19 May 2020 00:00:00 +0000</pubDate>
      
      <guid>/site/docs/guides/player-tracking/</guid>
      <description>
        
        
        


&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
    &lt;h4 class=&#34;alert-heading&#34;&gt;Warning&lt;/h4&gt;
    &lt;p&gt;The Player Tracking feature is currently &lt;strong&gt;&lt;a href=&#34;/site/site/docs/guides/feature-stages/#alpha&#34;&gt;Alpha&lt;/a&gt;&lt;/strong&gt;,
        not enabled by default, and may change in the future.&lt;/p&gt;
    &lt;p&gt;Use the Feature Gate &lt;code&gt;PlayerTracking&lt;/code&gt; to enable and test this feature.&lt;/p&gt;
    &lt;p&gt;See the &lt;a href=&#34;/site/site/docs/guides/feature-stages/#feature-gates&#34;&gt;Feature Gate documentation&lt;/a&gt; for details on how to enable features.&lt;/p&gt;
&lt;/div&gt;


&lt;h2 id=&#34;managing-gameserver-capacities&#34;&gt;Managing GameServer Capacities&lt;/h2&gt;

&lt;p&gt;To track your &lt;code&gt;GameServer&lt;/code&gt; current player capacity, Agones gives you the ability to both set an initial capacity at
&lt;code&gt;GameServer&lt;/code&gt; creation, as well be able to change it during the lifecycle of the &lt;code&gt;GameServer&lt;/code&gt; through the Agones SDK.&lt;/p&gt;

&lt;p&gt;To set the initial capacity, you can do so via &lt;code&gt;GameServer.Spec.Players.InitialCapacity&lt;/code&gt; like so:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;apiVersion&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones.dev/v1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;kind&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;GameServer&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;metadata&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;gs-example&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# ...&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;players&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# set this GameServer&amp;#39;s initial player capacity to 10&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;initialCapacity&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;10&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;From there, if you need to change the capacity of the GameSever as gameplay is in progress, you can also do so via
&lt;a href=&#34;/site/site/docs/guides/client-sdks/#alpha-setplayercapacity-count&#34;&gt;&lt;code&gt;SDK.Alpha().SetPlayerCapacity(count)&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The current player capacity is represented in &lt;code&gt;GameServer.Status.Players.Capacity&lt;/code&gt; resource value.&lt;/p&gt;

&lt;p&gt;We can see this in action, when we look at the Status section of a GameServer resource
, wherein the capacity has been set to 20:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;...
Status:
  Address:    14.81.195.72
  Node Name:  gke-test-cluster-default-6cd0ba67-1mps
  Players:
    Capacity:  20
    Count:     0
    Ids:       &amp;lt;nil&amp;gt;
  Ports:
    Name:          gameport
    Port:          7983
  Reserved Until:  &amp;lt;nil&amp;gt;
  State:           Ready
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;From the SDK, the game server binary can also retrieve the current player capacity
via &lt;a href=&#34;/site/site/docs/guides/client-sdks/#alpha-getplayercapacity&#34;&gt;&lt;code&gt;SDK.Alpha().GetPlayerCapacity()&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
&lt;p&gt;Changing the capacity value here has no impact on players actually
connected to or trying to connect to your server, as that is not a responsibility of Agones.&lt;/p&gt;

&lt;p&gt;This functionality is for tracking purposes only.&lt;/p&gt;

&lt;/div&gt;


&lt;h2 id=&#34;connecting-and-disconnecting-players&#34;&gt;Connecting and Disconnecting Players&lt;/h2&gt;

&lt;p&gt;As players connect and disconnect from your game, the Player Tracking functions enable you to track which players
are currently connected.&lt;/p&gt;

&lt;p&gt;It assumed that each player that connects has a unique token that identifies them as a player.&lt;/p&gt;

&lt;p&gt;When a player connects to the game server binary,
calling &lt;a href=&#34;/site/site/docs/guides/client-sdks/#alpha-playerconnect-playerid&#34;&gt;&lt;code&gt;SDK.Alpha().PlayerConnect(playerID)&lt;/code&gt;&lt;/a&gt;
with the unique player token will register them as connected, and store their player id.&lt;/p&gt;

&lt;p&gt;At disconnection time,
call &lt;a href=&#34;/site/site/docs/guides/client-sdks/#alpha-playerdisconnect-playerid&#34;&gt;&lt;code&gt;SDK.Alpha().PlayerDisconnect(playerID)&lt;/code&gt;&lt;/a&gt;
, which will deregister them and remove their player id from the list.&lt;/p&gt;

&lt;p&gt;Each of these &lt;code&gt;playerIDs&lt;/code&gt; is stored on &lt;code&gt;GameServer.Status.Players.IDs&lt;/code&gt;, and the current count of connected players
can be seen in &lt;code&gt;GameServer.Status.Players.Count&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can see this in action below in the &lt;code&gt;GameServer&lt;/code&gt; Status section, where there are 4 players connected:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;...
Status:
  Address:    39.82.196.74
  Node Name:  gke-test-cluster-default-6cd0ba77-1mps
  Players:
    Capacity:  10
    Count:     4
    Ids:
      xy8a
      m0ux
      71nj
      lpq5
  Ports:
    Name:          gameport
    Port:          7166
  Reserved Until:  &amp;lt;nil&amp;gt;
  State:           Ready
&lt;/code&gt;&lt;/pre&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
&lt;p&gt;Calling &lt;code&gt;PlayerConnect&lt;/code&gt; or &lt;code&gt;PlayerDisconnect&lt;/code&gt; functions will not
connect or disconnect players, as that is not under the control of Agones.&lt;/p&gt;

&lt;p&gt;This functionality is for tracking purposes only.&lt;/p&gt;

&lt;/div&gt;


&lt;h2 id=&#34;checking-player-data&#34;&gt;Checking Player Data&lt;/h2&gt;

&lt;p&gt;Not only is the connected player data stored on the &lt;code&gt;GameServer&lt;/code&gt; resource, it is also stored in memory within the
SDK, so that it can be used from within the game server binary as a realtime, thread safe, registry of connected
players.&lt;/p&gt;

&lt;p&gt;Therefore, if you want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get the current player count, call &lt;a href=&#34;/site/site/docs/guides/client-sdks/#alpha-getplayercount&#34;&gt;&lt;code&gt;SDK.Alpha().GetPlayerCount()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Check if a specific player is connected, call &lt;a href=&#34;/site/site/docs/guides/client-sdks/#alpha-isplayerconnected-playerid&#34;&gt;&lt;code&gt;SDK.Alpha().IsPlayerConnected(playerID)&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Retrieve the full list of connected players, call &lt;a href=&#34;/site/site/docs/guides/client-sdks/#alpha-getconnectedplayers&#34;&gt;&lt;code&gt;SDK.Alpha().GetConnectedPlayers()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Review the &lt;a href=&#34;/site/site/docs/guides/client-sdks/#player-tracking&#34;&gt;Player Tracking SDK Reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Third Party Libraries and Tools</title>
      <link>/site/docs/third-party-content/libraries-tools/</link>
      <pubDate>Fri, 15 May 2020 00:00:00 +0000</pubDate>
      
      <guid>/site/docs/third-party-content/libraries-tools/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;messaging&#34;&gt;Messaging&lt;/h2&gt;

&lt;p&gt;Libraries or applications that implement messaging systems.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Octops/agones-event-broadcaster&#34;&gt;Agones Event Broadcaster&lt;/a&gt; - Broadcast Agones events to the external world.&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: GameServerAllocation Specification</title>
      <link>/site/docs/reference/gameserverallocation/</link>
      <pubDate>Sun, 07 Jul 2019 03:58:52 +0000</pubDate>
      
      <guid>/site/docs/reference/gameserverallocation/</guid>
      <description>
        
        
        &lt;p&gt;A full &lt;code&gt;GameServerAllocation&lt;/code&gt; specification is available below and in the

&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//examples/gameserverallocation.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;example folder&lt;/a&gt;
 for reference:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;apiVersion&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;allocation.agones.dev/v1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;kind&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;GameServerAllocation&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# GameServer selector from which to choose GameServers from.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# GameServers still have the hard requirement to be `Ready` to be allocated from&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# however we can also make available `matchExpressions` for even greater&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# flexibility.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Below is an example of a GameServer allocated against a given fleet.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# See: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for more details&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;required&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;matchLabels&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;game&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;my-game&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;matchExpressions&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;{key&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;tier&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;operator&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;In&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;values&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;cache&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;}&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# ordered list of preferred allocations out of the `required` set.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# If the first selector is not matched, the selection attempts the second selector, and so on.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# This is useful for things like smoke testing of new game servers.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# This also support `matchExpressions`&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;preferred&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;matchLabels&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;agones.dev/fleet&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;green-fleet&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;matchLabels&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;agones.dev/fleet&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;blue-fleet&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# defines how GameServers are organised across the cluster.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Options include:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# &amp;#34;Packed&amp;#34; (default) is aimed at dynamic Kubernetes clusters, such as cloud providers, wherein we want to bin pack&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# resources&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# &amp;#34;Distributed&amp;#34; is aimed at static Kubernetes clusters, wherein we want to distribute resources across the entire&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# cluster&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;scheduling&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;Packed&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Optional custom metadata that is added to the game server at allocation&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# You can use this to tell the server necessary session data&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;metadata&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;labels&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;mode&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;deathmatch&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;annotations&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;map&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;garden22&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We recommend using &lt;code&gt;metadata &amp;gt; generateName&lt;/code&gt;, to declare to Kubernetes that a unique
name for the &lt;code&gt;GameServerAllocation&lt;/code&gt; is generated when the &lt;code&gt;GameServerAllocation&lt;/code&gt; is created.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;spec&lt;/code&gt; field is the actual &lt;code&gt;GameServerAllocation&lt;/code&gt; specification and it is composed as follow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;required&lt;/code&gt; is a &lt;a href=&#34;https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/&#34;&gt;label selector&lt;/a&gt;
(matchLabels and/or matchExpressions) from which to choose GameServers from.
GameServers still have the hard requirement to be &lt;code&gt;Ready&lt;/code&gt; to be allocated from&lt;/li&gt;
&lt;li&gt;&lt;code&gt;preferred&lt;/code&gt; is an order list of &lt;a href=&#34;https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/&#34;&gt;label selectors&lt;/a&gt;
out of the &lt;code&gt;required&lt;/code&gt; set.
If the first selector is not matched, the selection attempts the second selector, and so on.
This is useful for things like smoke testing of new game servers.&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;code&gt;scheduling&lt;/code&gt; defines how GameServers are organised across the cluster, in this case specifically when allocating
&lt;code&gt;GameServers&lt;/code&gt; for usage.
&amp;ldquo;Packed&amp;rdquo; (default) is aimed at dynamic Kubernetes clusters, such as cloud providers, wherein we want to bin pack
resources. &amp;ldquo;Distributed&amp;rdquo; is aimed at static Kubernetes clusters, wherein we want to distribute resources across the entire
cluster. See &lt;a href=&#34;/site/site/docs/advanced/scheduling-and-autoscaling/&#34;&gt;Scheduling and Autoscaling&lt;/a&gt; for more details.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;code&gt;metadata&lt;/code&gt; is an optional list of custom labels and/or annotations that will be used to patch
the game server&amp;rsquo;s metadata in the moment of allocation. This can be used to tell the server necessary session data&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Go Game Server Client SDK</title>
      <link>/site/docs/guides/client-sdks/go/</link>
      <pubDate>Fri, 17 May 2019 10:17:50 +0000</pubDate>
      
      <guid>/site/docs/guides/client-sdks/go/</guid>
      <description>
        
        
        

&lt;p&gt;Check the &lt;a href=&#34;/site/site/docs/guides/client-sdks/&#34;&gt;Client SDK Documentation&lt;/a&gt; for more details on each of the SDK functions and how to run the SDK locally.&lt;/p&gt;

&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;go get&lt;/code&gt; the source, 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/sdks/go&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;directly from GitHub&lt;/a&gt;
&lt;/p&gt;

&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;

&lt;p&gt;Review the &lt;a href=&#34;https://pkg.go.dev/agones.dev/agones/sdks/go&#34;&gt;GoDoc&lt;/a&gt; for usage instructions&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Limiting CPU &amp; Memory</title>
      <link>/site/docs/advanced/limiting-resources/</link>
      <pubDate>Thu, 03 Jan 2019 05:45:15 +0000</pubDate>
      
      <guid>/site/docs/advanced/limiting-resources/</guid>
      <description>
        
        
        

&lt;p&gt;As a short description:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU &lt;code&gt;Requests&lt;/code&gt; are limits that are applied when there is CPU congestion, and as such can burst above their set limits.&lt;/li&gt;
&lt;li&gt;CPU &lt;code&gt;Limits&lt;/code&gt; are hard limits on how much CPU time the particular container gets access to.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is useful for game servers, not just as a mechanism to distribute compute resources evenly, but also as a way
to advice the Kubernetes scheduler how many game server processes it is able to fit into a given node in the cluster.&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s worth reading the &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/&#34;&gt;Managing Compute Resources for Containers&lt;/a&gt;
Kubernetes documentation for more details on &amp;ldquo;requests&amp;rdquo; and &amp;ldquo;limits&amp;rdquo; to both CPU and Memory, and how to configure them.&lt;/p&gt;

&lt;h2 id=&#34;gameservers&#34;&gt;GameServers&lt;/h2&gt;

&lt;p&gt;Since the &lt;code&gt;GameServer&lt;/code&gt; specification provides a full &lt;a href=&#34;https://v1-15.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.15/#podtemplatespec-v1-core&#34;&gt;&lt;code&gt;PodSpecTemplate&lt;/code&gt;&lt;/a&gt;,
we can take advantage of both resource limits and requests in our &lt;code&gt;GameServer&lt;/code&gt; configurations.&lt;/p&gt;

&lt;p&gt;For example, to set a CPU limit on our &lt;code&gt;GameServer&lt;/code&gt; configuration of &lt;code&gt;250m/0.25&lt;/code&gt; of a CPU,
we could do so as followed:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;apiVersion&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones.dev/v1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;kind&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;GameServer&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;metadata&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;simple-udp&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;ports&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;default&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;containerPort&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;7654&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;template&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;containers&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;simple-udp&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;image&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;gcr.io/agones-images/udp-server&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0.21&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;resources&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;          &lt;/span&gt;limit&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;            &lt;/span&gt;cpu&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;250m&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#this is our limit here&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you do not set a limit or request, the default is set by Kubernetes at a 100m CPU request.&lt;/p&gt;

&lt;h2 id=&#34;sdk-gameserver-sidecar&#34;&gt;SDK GameServer sidecar&lt;/h2&gt;

&lt;p&gt;You may also want to tweak the CPU request or limits on the SDK &lt;code&gt;GameServer&lt;/code&gt; sidecar process that spins up alongside
each game server container.&lt;/p&gt;

&lt;p&gt;You can do this through the &lt;a href=&#34;/site/site/docs/installation/install-agones/helm/&#34;&gt;Helm configuration&lt;/a&gt; when installing Agones.&lt;/p&gt;

&lt;p&gt;By default, this is set to having a CPU request value of 30m, with no hard CPU limit. This ensures that the sidecar always has enough CPU
to function, but it is configurable in case a lower, or higher value is required on your clusters, or if you desire
hard limit.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Fleet Autoscaler Specification</title>
      <link>/site/docs/reference/fleetautoscaler/</link>
      <pubDate>Thu, 03 Jan 2019 03:58:55 +0000</pubDate>
      
      <guid>/site/docs/reference/fleetautoscaler/</guid>
      <description>
        
        
        

&lt;p&gt;A full &lt;code&gt;FleetAutoscaler&lt;/code&gt; specification is available below and in the

&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/fleetautoscaler.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;example folder&lt;/a&gt;
 for reference :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;apiVersion&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;autoscaling.agones.dev/v1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;kind&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;FleetAutoscaler&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# FleetAutoscaler Metadata&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# https://v1-15.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.15/#objectmeta-v1-meta&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;metadata&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;fleet-autoscaler-example&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# The name of the fleet to attach to and control. Must be an existing Fleet in the same namespace&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# as this FleetAutoscaler&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;fleetName&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;fleet-example&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# The autoscaling policy&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;policy&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# type of the policy. for now, only Buffer is available&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;type&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;Buffer&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# parameters of the buffer policy&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;buffer&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Size of a buffer of &amp;#34;ready&amp;#34; game server instances&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# The FleetAutoscaler will scale the fleet up and down trying to maintain this buffer, &lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# as instances are being allocated or terminated&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# it can be specified either in absolute (i.e. 5) or percentage format (i.e. 5%)&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;bufferSize&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# minimum fleet size to be set by this FleetAutoscaler. &lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# if not specified, the actual minimum fleet size will be bufferSize&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;minReplicas&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# maximum fleet size that can be set by this FleetAutoscaler&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# required&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;maxReplicas&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;20&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Or for Webhook FleetAutoscaler below and in 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/webhookfleetautoscaler.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;example folder&lt;/a&gt;
:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;apiVersion&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;autoscaling.agones.dev/v1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;kind&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;FleetAutoscaler&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;metadata&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;webhook-fleet-autoscaler&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;fleetName&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;simple-udp&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;policy&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# type of the policy - this example is Webhook&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;type&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;Webhook&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# parameters for the webhook policy - this is a WebhookClientConfig, as per other K8s webhooks&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;webhook&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# use a service, or URL&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;service&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;autoscaler-webhook-service&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;namespace&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;default&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;path&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;scale&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# optional for URL defined webhooks&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# url: &amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# caBundle:  optional, used for HTTPS webhook type&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Since Agones defines a new
&lt;a href=&#34;https://kubernetes.io/docs/concepts/api-extension/custom-resources/&#34;&gt;Custom Resources Definition (CRD)&lt;/a&gt;
we can define a new resource using the kind &lt;code&gt;FleetAutoscaler&lt;/code&gt; with the custom group &lt;code&gt;autoscaling.agones.dev&lt;/code&gt;
and API version &lt;code&gt;v1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;spec&lt;/code&gt; field is the actual &lt;code&gt;FleetAutoscaler&lt;/code&gt; specification and it is composed as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fleetName&lt;/code&gt; is name of the fleet to attach to and control. Must be an existing &lt;code&gt;Fleet&lt;/code&gt; in the same namespace
as this &lt;code&gt;FleetAutoscaler&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;policy&lt;/code&gt; is the autoscaling policy

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;type&lt;/code&gt; is type of the policy. &amp;ldquo;Buffer&amp;rdquo; and &amp;ldquo;Webhook&amp;rdquo; are available&lt;/li&gt;
&lt;li&gt;&lt;code&gt;buffer&lt;/code&gt; parameters of the buffer policy type&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bufferSize&lt;/code&gt;  is the size of a buffer of &amp;ldquo;ready&amp;rdquo; and &amp;ldquo;reserved&amp;rdquo; game server instances.
            The FleetAutoscaler will scale the fleet up and down trying to maintain this buffer,
            as instances are being allocated or terminated.
            Note that &amp;ldquo;reserved&amp;rdquo; game servers could not be scaled down.
            It can be specified either in absolute (i.e. 5) or percentage format (i.e. 5%)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;minReplicas&lt;/code&gt; is the minimum fleet size to be set by this FleetAutoscaler.
            if not specified, the minimum fleet size will be bufferSize if absolute value is used.
            When &lt;code&gt;bufferSize&lt;/code&gt; in percentage format is used, &lt;code&gt;minReplicas&lt;/code&gt; should be more than 0.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;maxReplicas&lt;/code&gt; is the maximum fleet size that can be set by this FleetAutoscaler. Required.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;webhook&lt;/code&gt; parameters of the webhook policy type&lt;/li&gt;
&lt;li&gt;&lt;code&gt;service&lt;/code&gt; is a reference to the service for this webhook. Either &lt;code&gt;service&lt;/code&gt; or &lt;code&gt;url&lt;/code&gt; must be specified. If the webhook is running within the cluster, then you should use &lt;code&gt;service&lt;/code&gt;. Port 8000 will be used if it is open, otherwise it is an error.

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt;  is the service name bound to Deployment of autoscaler webhook. Required 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/autoscaler-webhook/autoscaler-service.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;(see example)&lt;/a&gt;

          The FleetAutoscaler will scale the fleet up and down based on the response from this webhook server&lt;/li&gt;
&lt;li&gt;&lt;code&gt;namespace&lt;/code&gt; is the kubernetes namespace where webhook is deployed. Optional
          If not specified, the &amp;ldquo;default&amp;rdquo; would be used&lt;/li&gt;
&lt;li&gt;&lt;code&gt;path&lt;/code&gt; is an optional URL path which will be sent in any request to this service. (i. e. /scale)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;url&lt;/code&gt; gives the location of the webhook, in standard URL form (&lt;code&gt;[scheme://]host:port/path&lt;/code&gt;). Exactly one of &lt;code&gt;url&lt;/code&gt; or &lt;code&gt;service&lt;/code&gt; must be specified. The &lt;code&gt;host&lt;/code&gt; should not refer to a service running in the cluster; use the &lt;code&gt;service&lt;/code&gt; field instead.  (optional, instead of service)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;caBundle&lt;/code&gt; is a PEM encoded certificate authority bundle which is used to issue and then validate the webhook&amp;rsquo;s server certificate. Base64 encoded PEM string. Required only for HTTPS. If not present HTTP client would be used.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: only one &lt;code&gt;buffer&lt;/code&gt; or &lt;code&gt;webhook&lt;/code&gt; could be defined for FleetAutoscaler which is based on the &lt;code&gt;type&lt;/code&gt; field.&lt;/p&gt;

&lt;h1 id=&#34;webhook-endpoint-specification&#34;&gt;Webhook Endpoint Specification&lt;/h1&gt;

&lt;p&gt;Webhook endpoint is used to delegate the scaling logic to a separate pod or server.&lt;/p&gt;

&lt;p&gt;FleetAutoscaler would send a request to the webhook endpoint every sync period (which is currently 30s) with a JSON body, and scale the target fleet based on the data that is returned.
JSON payload with a FleetAutoscaleReview data structure would be sent to webhook endpoint and received from it with FleetAutoscaleResponse field populated. FleetAutoscaleResponse contains target Replica count which would trigger scaling of the fleet according to it.&lt;/p&gt;

&lt;p&gt;In order to define the path to your Webhook you can use either &lt;code&gt;URL&lt;/code&gt; or &lt;code&gt;service&lt;/code&gt;. Note that &lt;code&gt;caBundle&lt;/code&gt; parameter is required if you use HTTPS for webhook fleetautoscaler, &lt;code&gt;caBundle&lt;/code&gt; should be omitted if you want to use HTTP webhook server.&lt;/p&gt;

&lt;p&gt;The connection to this webhook endpoint should be defined in &lt;code&gt;FleetAutoscaler&lt;/code&gt; using Webhook policy type.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// FleetAutoscaleReview is passed to the webhook with a populated Request value,
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// and then returned with a populated Response.
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;FleetAutoscaleReview&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
	&lt;span style=&#34;color:#000&#34;&gt;Request&lt;/span&gt;  &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;FleetAutoscaleRequest&lt;/span&gt;  &lt;span style=&#34;color:#4e9a06&#34;&gt;`json:&amp;#34;request&amp;#34;`&lt;/span&gt;
	&lt;span style=&#34;color:#000&#34;&gt;Response&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;FleetAutoscaleResponse&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;`json:&amp;#34;response&amp;#34;`&lt;/span&gt;
&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;FleetAutoscaleRequest&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// UID is an identifier for the individual request/response. It allows us to distinguish instances of requests which are
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// otherwise identical (parallel requests, requests when earlier requests did not modify etc)
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// The UID is meant to track the round trip (request/response) between the Autoscaler and the WebHook, not the user request.
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// It is suitable for correlating log entries between the webhook and apiserver, for either auditing or debugging.
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#000&#34;&gt;UID&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;types&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;UID&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;`json:&amp;#34;uid&amp;#34;&amp;#34;`&lt;/span&gt;
	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Name is the name of the Fleet being scaled
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#000&#34;&gt;Name&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;`json:&amp;#34;name&amp;#34;`&lt;/span&gt;
	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Namespace is the namespace associated with the request (if any).
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#000&#34;&gt;Namespace&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;`json:&amp;#34;namespace&amp;#34;`&lt;/span&gt;
	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// The Fleet&amp;#39;s status values
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#000&#34;&gt;Status&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;v1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;FleetStatus&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;`json:&amp;#34;status&amp;#34;`&lt;/span&gt;
&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;FleetAutoscaleResponse&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// UID is an identifier for the individual request/response.
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// This should be copied over from the corresponding FleetAutoscaleRequest.
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#000&#34;&gt;UID&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;types&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;UID&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;`json:&amp;#34;uid&amp;#34;`&lt;/span&gt;
	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Set to false if no scaling should occur to the Fleet
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#000&#34;&gt;Scale&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;`json:&amp;#34;scale&amp;#34;`&lt;/span&gt;
	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// The targeted replica count
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#000&#34;&gt;Replicas&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int32&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;`json:&amp;#34;replicas&amp;#34;`&lt;/span&gt;
&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// FleetStatus is the status of a Fleet
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;FleetStatus&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Replicas the total number of current GameServer replicas
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#000&#34;&gt;Replicas&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int32&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;`json:&amp;#34;replicas&amp;#34;`&lt;/span&gt;
	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// ReadyReplicas are the number of Ready GameServer replicas
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#000&#34;&gt;ReadyReplicas&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int32&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;`json:&amp;#34;readyReplicas&amp;#34;`&lt;/span&gt;
	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// ReservedReplicas are the total number of Reserved GameServer replicas in this fleet.
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Reserved instances won&amp;#39;t be deleted on scale down, but won&amp;#39;t cause an autoscaler to scale up.
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#000&#34;&gt;ReservedReplicas&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int32&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;`json:&amp;#34;reservedReplicas&amp;#34;`&lt;/span&gt;
	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// AllocatedReplicas are the number of Allocated GameServer replicas
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#000&#34;&gt;AllocatedReplicas&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int32&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;`json:&amp;#34;allocatedReplicas&amp;#34;`&lt;/span&gt;
&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For Webhook Fleetautoscaler Policy either HTTP or HTTPS could be used. Switching between them occurs depending on https presence in &lt;code&gt;URL&lt;/code&gt; or by the presence of &lt;code&gt;caBundle&lt;/code&gt;.
The example of the webhook written in Go could be found 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/autoscaler-webhook/main.go&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;here&lt;/a&gt;
.&lt;/p&gt;

&lt;p&gt;It implements the 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/autoscaler-webhook/&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;scaling logic&lt;/a&gt;
 based on the percentage of allocated gameservers in a fleet.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Quickstart: Create a Fleet Autoscaler</title>
      <link>/site/docs/getting-started/create-fleetautoscaler/</link>
      <pubDate>Wed, 02 Jan 2019 06:42:33 +0000</pubDate>
      
      <guid>/site/docs/getting-started/create-fleetautoscaler/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;

&lt;p&gt;It is assumed that you have followed the instructions to &lt;a href=&#34;/site/site/docs/getting-started/create-fleet/&#34;&gt;Create a Game Server Fleet&lt;/a&gt;
and you have a running fleet of game servers.&lt;/p&gt;

&lt;h2 id=&#34;objectives&#34;&gt;Objectives&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create a Fleet Autoscaler in Kubernetes using Agones custom resource.&lt;/li&gt;
&lt;li&gt;Watch the Fleet scale up when allocating GameServers&lt;/li&gt;
&lt;li&gt;Watch the Fleet scale down when shutting down allocated GameServers&lt;/li&gt;
&lt;li&gt;Edit the autoscaler specification to apply live changes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;1-create-a-fleet-autoscaler&#34;&gt;1. Create a Fleet Autoscaler&lt;/h3&gt;

&lt;p&gt;Let&amp;rsquo;s create a Fleet Autoscaler using the following command :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/simple-udp/fleetautoscaler.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You should see a successful output similar to this :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;fleetautoscaler.autoscaling.agones.dev &amp;quot;simple-udp-autoscaler&amp;quot; created
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This has created a FleetAutoscaler record inside Kubernetes.&lt;/p&gt;

&lt;h3 id=&#34;2-see-the-autoscaler-status&#34;&gt;2. See the autoscaler status.&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;kubectl describe fleetautoscaler simple-udp-autoscaler
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It should look something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Name:         simple-udp-autoscaler
Namespace:    default
Labels:       &amp;lt;none&amp;gt;
Annotations:  kubectl.kubernetes.io/last-applied-configuration={&amp;quot;apiVersion&amp;quot;:&amp;quot;au
toscaling.agones.dev/v1&amp;quot;,&amp;quot;kind&amp;quot;:&amp;quot;FleetAutoscaler&amp;quot;,&amp;quot;metadata&amp;quot;:{&amp;quot;annotations&amp;quot;:{},
&amp;quot;name&amp;quot;:&amp;quot;simple-udp-autoscaler&amp;quot;,&amp;quot;namespace&amp;quot;:&amp;quot;default&amp;quot;},...
API Version:  autoscaling.agones.dev/v1
Kind:         FleetAutoscaler
Metadata:
  Cluster Name:
  Creation Timestamp:  2018-10-02T15:19:58Z
  Generation:          1
  Owner References:
    API Version:           autoscaling.agones.dev/v1
    Block Owner Deletion:  true
    Controller:            true
    Kind:                  Fleet
    Name:                  simple-udp
    UID:                   9960762e-c656-11e8-933e-fa163e07a1d4
  Resource Version:        6123197
  Self Link:               /apis/autoscaling.agones.dev/v1/namespaces/default/f
leetautoscalers/simple-udp-autoscaler
  UID:                     9fd0efa1-c656-11e8-933e-fa163e07a1d4
Spec:
  Fleet Name:  simple-udp
  Policy:
    Buffer:
      Buffer Size:   2
      Max Replicas:  10
      Min Replicas:  2
    Type:            Buffer
Status:
  Able To Scale:     true
  Current Replicas:  2
  Desired Replicas:  2
  Last Scale Time:   &amp;lt;nil&amp;gt;
  Scaling Limited:   false
Events:              &amp;lt;none&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can see the status (able to scale, not limited), the last time the fleet was scaled (nil for never)
and the current and desired fleet size.&lt;/p&gt;

&lt;p&gt;The autoscaler works by changing the desired size, and the fleet creates/deletes game server instances
to achieve that number. The convergence is achieved in time, which is usually measured in seconds.&lt;/p&gt;

&lt;h3 id=&#34;3-allocate-a-game-server-from-the-fleet&#34;&gt;3. Allocate a Game Server from the Fleet&lt;/h3&gt;

&lt;p&gt;If you&amp;rsquo;re interested in more details for game server allocation, you should consult the &lt;a href=&#34;/site/site/docs/getting-started/create-fleet/&#34;&gt;Create a Game Server Fleet&lt;/a&gt; page.
In here we are only interested in triggering allocations to see the autoscaler in action.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/simple-udp/gameserverallocation.yaml -o yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You should get in return the allocated game server details, which should end with something like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;status:
  address: 34.94.118.237
  gameServerName: simple-udp-v6jwb-6bzkz
  nodeName: gke-test-cluster-default-f11755a7-5km3
  ports:
  - name: default
    port: 7832
  state: Allocated
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note the address and port, you might need them later to connect to the server.&lt;/p&gt;

&lt;h3 id=&#34;4-see-the-autoscaler-in-action&#34;&gt;4. See the autoscaler in action&lt;/h3&gt;

&lt;p&gt;Now let&amp;rsquo;s wait a few seconds to allow the autoscaler to detect the change in the fleet and check again its status&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl describe fleetautoscaler simple-udp-autoscaler
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The last part should look something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Spec:
  Fleet Name:  simple-udp
  Policy:
    Buffer:
      Buffer Size:   2
      Max Replicas:  10
      Min Replicas:  2
    Type:            Buffer
Status:
  Able To Scale:     true
  Current Replicas:  3
  Desired Replicas:  3
  Last Scale Time:   2018-10-02T16:00:02Z
  Scaling Limited:   false
Events:
  Type    Reason            Age   From                        Message
  ----    ------            ----  ----                        -------
  Normal  AutoScalingFleet  2m    fleetautoscaler-controller  Scaling fleet simple-udp from 2 to 3
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can see that the fleet size has increased, the autoscaler having compensated for the allocated instance.
Last Scale Time has been updated, and a scaling event has been logged.&lt;/p&gt;

&lt;p&gt;Double-check the actual number of game server instances and status by running&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl get gs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will get you a list of all the current &lt;code&gt;GameServers&lt;/code&gt; and their &lt;code&gt;Status &amp;gt; State&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NAME                     STATE       ADDRESS        PORT     NODE        AGE
simple-udp-mzhrl-hz8wk   Allocated   10.30.64.99    7131     minikube    5m
simple-udp-mzhrl-k6jg5   Ready       10.30.64.100   7243     minikube    5m  
simple-udp-mzhrl-n2sk2   Ready       10.30.64.168   7658     minikube    5m
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;5-shut-the-allocated-instance-down&#34;&gt;5. Shut the allocated instance down&lt;/h3&gt;

&lt;p&gt;Since we&amp;rsquo;ve only got one allocation, we&amp;rsquo;ll just grab the details of the IP and port of the
only allocated &lt;code&gt;GameServer&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl get gameservers | grep Allocated | awk &#39;{print $3&amp;quot;:&amp;quot;$4 }&#39;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This should output your Game Server IP address and port. (eg &lt;code&gt;10.130.65.208:7936&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;You can now communicate with the &lt;code&gt;GameServer&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nc -u {IP} {PORT}
Hello World !
ACK: Hello World !
EXIT
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can finally type &lt;code&gt;EXIT&lt;/code&gt; which tells the SDK to run the &lt;a href=&#34;/site/site/docs/guides/client-sdks/#shutdown&#34;&gt;Shutdown command&lt;/a&gt;, and therefore shuts down the &lt;code&gt;GameServer&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&#34;6-see-the-fleet-scaling-down&#34;&gt;6. See the fleet scaling down&lt;/h3&gt;

&lt;p&gt;Now let&amp;rsquo;s wait a few seconds to allow the autoscaler to detect the change in the fleet and check again its status&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl describe fleetautoscaler simple-udp-autoscaler
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It should look something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Spec:
  Fleet Name:  simple-udp
  Policy:
    Buffer:
      Buffer Size:   2
      Max Replicas:  10
      Min Replicas:  2
    Type:            Buffer
Status:
  Able To Scale:     true
  Current Replicas:  3
  Desired Replicas:  2
  Last Scale Time:   2018-10-02T16:09:02Z
  Scaling Limited:   false
Events:
  Type    Reason            Age   From                        Message
  ----    ------            ----  ----                        -------
  Normal  AutoScalingFleet  9m    fleetautoscaler-controller  Scaling fleet simple-udp from 2 to 3
  Normal  AutoScalingFleet  45s   fleetautoscaler-controller  Scaling fleet simple-udp from 3 to 2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can see that the fleet size has decreased, the autoscaler adjusting to game server instance being de-allocated,
the Last Scale Time and the events have been updated. Note that simple-udp game server instance you just closed earlier
might stay a bit in &amp;lsquo;Unhealthy&amp;rsquo; state (and its pod in &amp;lsquo;Terminating&amp;rsquo; until it gets removed.&lt;/p&gt;

&lt;p&gt;Double-check the actual number of game server instances and status by running&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl get gs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will get you a list of all the current &lt;code&gt;GameServers&lt;/code&gt; and their &lt;code&gt;Status &amp;gt; State&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NAME                     STATE     ADDRESS        PORT    NODE       AGE
simple-udp-mzhrl-k6jg5   Ready     10.30.64.100   7243    minikube   5m
simple-udp-mzhrl-t7944   Ready     10.30.64.168   7561    minikube   5m
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;7-change-autoscaling-parameters&#34;&gt;7. Change autoscaling parameters&lt;/h3&gt;

&lt;p&gt;We can also change the configuration of the &lt;code&gt;FleetAutoscaler&lt;/code&gt; of the running &lt;code&gt;Fleet&lt;/code&gt;, and have the changes
applied live, without interruptions of service.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;kubectl edit fleetautoscaler simple-udp-autoscaler&lt;/code&gt; and set the &lt;code&gt;bufferSize&lt;/code&gt; field to &lt;code&gt;5&lt;/code&gt;.
]
Let&amp;rsquo;s look at the list of game servers again. Run &lt;code&gt;watch kubectl get gs&lt;/code&gt;
until you can see that are 5 ready server instances:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NAME                     STATE     ADDRESS        PORT    NODE         AGE
simple-udp-mzhrl-7jpkp   Ready     10.30.64.100   7019    minikube     5m
simple-udp-mzhrl-czt8v   Ready     10.30.64.168   7556    minikube     5m
simple-udp-mzhrl-k6jg5   Ready     10.30.64.100   7243    minikube     5m
simple-udp-mzhrl-nb8h2   Ready     10.30.64.168   7357    minikube     5m
simple-udp-mzhrl-qspb6   Ready     10.30.64.99    7859    minikube     5m
simple-udp-mzhrl-zg9rq   Ready     10.30.64.99    7745    minikube     5m
&lt;/code&gt;&lt;/pre&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
&lt;p&gt;If you want to update a &lt;code&gt;Fleet&lt;/code&gt; which has &lt;code&gt;RollingUpdate&lt;/code&gt; replacement strategy and is controlled by a &lt;code&gt;FleetAutoscaler&lt;/code&gt;:
1. With &lt;code&gt;kubectl apply&lt;/code&gt;: you should omit &lt;code&gt;replicas&lt;/code&gt; parameter in a &lt;code&gt;Fleet&lt;/code&gt; Spec before re-applying the &lt;code&gt;Fleet&lt;/code&gt; configuration.
1. With &lt;code&gt;kubectl edit&lt;/code&gt;: you should not change the &lt;code&gt;replicas&lt;/code&gt; parameter in the &lt;code&gt;Fleet&lt;/code&gt; Spec when updating other field parameters.&lt;/p&gt;

&lt;p&gt;If you follow the rules above, then the &lt;code&gt;maxSurge&lt;/code&gt; and &lt;code&gt;maxUnavailable&lt;/code&gt; parameters will be used as the RollingUpdate strategy updates your Fleet.
Otherwise the Fleet would be scaled according to Fleet &lt;code&gt;replicas&lt;/code&gt; parameter first and only after a certain amount of time it would be rescaled to fit &lt;code&gt;FleetAutoscaler&lt;/code&gt; &lt;code&gt;BufferSize&lt;/code&gt; parameter.&lt;/p&gt;

&lt;p&gt;You could also check the behaviour of the Fleet with Fleetautoscaler on a test &lt;code&gt;Fleet&lt;/code&gt; to preview what would occur in your production environment.&lt;/p&gt;

&lt;/div&gt;


&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h2&gt;

&lt;p&gt;Read the advanced &lt;a href=&#34;/site/site/docs/advanced/scheduling-and-autoscaling/&#34;&gt;Scheduling and Autoscaling&lt;/a&gt; guide, for more details on autoscaling.&lt;/p&gt;

&lt;p&gt;If you want to use your own GameServer container make sure you have properly integrated the &lt;a href=&#34;/site/site/docs/guides/client-sdks/&#34;&gt;Agones SDK&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Azure Kubernetes Service</title>
      <link>/site/docs/installation/creating-cluster/aks/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/site/docs/installation/creating-cluster/aks/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;choosing-your-shell&#34;&gt;Choosing your shell&lt;/h2&gt;

&lt;p&gt;You can use either &lt;a href=&#34;https://docs.microsoft.com/azure/cloud-shell/overview&#34;&gt;Azure Cloud Shell&lt;/a&gt; or install the &lt;a href=&#34;https://docs.microsoft.com/cli/azure/?view=azure-cli-latest&#34;&gt;Azure CLI&lt;/a&gt; on your local shell in order to install AKS in your own Azure subscription. Cloud Shell comes preinstalled with &lt;code&gt;az&lt;/code&gt; and &lt;code&gt;kubectl&lt;/code&gt; utilities whereas you need to install them locally if you want to use your local shell. If you use Windows 10, you can use the &lt;a href=&#34;https://docs.microsoft.com/windows/wsl/install-win10&#34;&gt;WIndows Subsystem for Windows&lt;/a&gt; as well.&lt;/p&gt;

&lt;h2 id=&#34;creating-the-aks-cluster&#34;&gt;Creating the AKS cluster&lt;/h2&gt;

&lt;p&gt;If you are using Azure CLI from your local shell, you need to log in to your Azure account by executing the &lt;code&gt;az login&lt;/code&gt; command and following the login procedure.&lt;/p&gt;

&lt;p&gt;Here are the steps you need to follow to create a new AKS cluster (additional instructions and clarifications are listed &lt;a href=&#34;https://docs.microsoft.com/azure/aks/kubernetes-walkthrough&#34;&gt;here&lt;/a&gt;):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Declare necessary variables, modify them according to your needs&lt;/span&gt;
&lt;span style=&#34;color:#000&#34;&gt;AKS_RESOURCE_GROUP&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;akstestrg     &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Name of the resource group your AKS cluster will be created in&lt;/span&gt;
&lt;span style=&#34;color:#000&#34;&gt;AKS_NAME&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;akstest                 &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Name of your AKS cluster&lt;/span&gt;
&lt;span style=&#34;color:#000&#34;&gt;AKS_LOCATION&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;westeurope          &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Azure region in which you&amp;#39;ll deploy your AKS cluster&lt;/span&gt;

&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Create the Resource Group where your AKS resource will be installed&lt;/span&gt;
az group create --name &lt;span style=&#34;color:#000&#34;&gt;$AKS_RESOURCE_GROUP&lt;/span&gt; --location &lt;span style=&#34;color:#000&#34;&gt;$AKS_LOCATION&lt;/span&gt;

&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Create the AKS cluster - this might take some time. Type &amp;#39;az aks create -h&amp;#39; to see all available options&lt;/span&gt;
&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# The following command will create a four Node AKS cluster. Node size is Standard A1 v1 and Kubernetes version is 1.15.10. Plus, SSH keys will be generated for you, use --ssh-key-value to provide your values&lt;/span&gt;
az aks create --resource-group &lt;span style=&#34;color:#000&#34;&gt;$AKS_RESOURCE_GROUP&lt;/span&gt; --name &lt;span style=&#34;color:#000&#34;&gt;$AKS_NAME&lt;/span&gt; --node-count &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;4&lt;/span&gt; --generate-ssh-keys --node-vm-size Standard_A4_v2 --kubernetes-version &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;.15.10

&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Install kubectl&lt;/span&gt;
sudo az aks install-cli

&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Get credentials for your new AKS cluster&lt;/span&gt;
az aks get-credentials --resource-group &lt;span style=&#34;color:#000&#34;&gt;$AKS_RESOURCE_GROUP&lt;/span&gt; --name &lt;span style=&#34;color:#000&#34;&gt;$AKS_NAME&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Alternatively, you can use the &lt;a href=&#34;https://portal.azure.com&#34;&gt;Azure Portal&lt;/a&gt; to create a new AKS cluster &lt;a href=&#34;https://docs.microsoft.com/azure/aks/kubernetes-walkthrough-portal&#34;&gt;(instructions)&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&#34;allowing-udp-traffic&#34;&gt;Allowing UDP traffic&lt;/h3&gt;

&lt;p&gt;For Agones to work correctly, we need to allow UDP traffic to pass through to our AKS cluster. To achieve this, we must update the NSG (Network Security Group) with the proper rule. A simple way to do that is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Log in to the Azure Portal&lt;/li&gt;
&lt;li&gt;Find the resource group where the AKS resources are kept, which should have a name like &lt;code&gt;MC_resourceGroupName_AKSName_westeurope&lt;/code&gt;. Alternative, you can type &lt;code&gt;az resource show --namespace Microsoft.ContainerService --resource-type managedClusters -g $AKS_RESOURCE_GROUP -n $AKS_NAME -o json | jq .properties.nodeResourceGroup&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Find the Network Security Group object, which should have a name like &lt;code&gt;aks-agentpool-********-nsg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Inbound Security Rules&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Add&lt;/strong&gt; to create a new Rule with &lt;strong&gt;UDP&lt;/strong&gt; as the protocol and &lt;strong&gt;7000-8000&lt;/strong&gt; as the Destination Port Ranges. Pick a proper name and leave everything else at their default values&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alternatively, you can use the following command, after modifying the &lt;code&gt;RESOURCE_GROUP_WITH_AKS_RESOURCES&lt;/code&gt; and &lt;code&gt;NSG_NAME&lt;/code&gt; values:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;az network nsg rule create &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --resource-group RESOURCE_GROUP_WITH_AKS_RESOURCES &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --nsg-name NSG_NAME &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --name AgonesUDP &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --access Allow &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --protocol Udp &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --direction Inbound &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --priority &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;520&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --source-port-range &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --destination-port-range &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;7000&lt;/span&gt;-8000&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;creating-and-assigning-public-ips-to-nodes&#34;&gt;Creating and assigning Public IPs to Nodes&lt;/h3&gt;

&lt;p&gt;Nodes in AKS don&amp;rsquo;t get a Public IP by default. To assign a Public IP to a Node, find the Resource Group where the AKS resources are installed on the &lt;a href=&#34;https://portal.azure.com&#34;&gt;portal&lt;/a&gt; (it should have a name like &lt;code&gt;MC_resourceGroupName_AKSName_westeurope&lt;/code&gt;). Then, you can follow the instructions &lt;a href=&#34;https://docs.microsoft.com/en-us/azure/site-recovery/concepts-public-ip-address-with-site-recovery&#34;&gt;here&lt;/a&gt; to create a new Public IP and assign it to the Node/VM. For more information on Public IPs for VM NICs, see &lt;a href=&#34;https://docs.microsoft.com/azure/virtual-network/virtual-network-network-interface-addresses&#34;&gt;this document&lt;/a&gt;. If you are looking for an automated way to create and assign Public IPs for your AKS Nodes, check &lt;a href=&#34;https://github.com/dgkanatsios/AksNodePublicIPController&#34;&gt;this project&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Continue to &lt;a href=&#34;/site/site/docs/installation/install-agones/&#34;&gt;Install Agones&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Local Game Server</title>
      <link>/site/docs/guides/local-game-server/</link>
      <pubDate>Tue, 19 Feb 2019 08:00:00 +0000</pubDate>
      
      <guid>/site/docs/guides/local-game-server/</guid>
      <description>
        
        
        

&lt;p&gt;You can register a local game server with Agones. This means you can run an experimental build of your game server in the Agones environment without the need of packaging and deploying it to a fleet. This allows you to quickly iterate on your game server code while still being able to plugin to your Agones environment.&lt;/p&gt;

&lt;h2 id=&#34;register-your-server-with-agones&#34;&gt;Register your server with Agones&lt;/h2&gt;

&lt;p&gt;To register your local game server you&amp;rsquo;ll need to know the IP address of the machine running it and the port. With that you&amp;rsquo;ll create a game server config like the one below.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;apiVersion&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones.dev/v1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;kind&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;GameServer&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;metadata&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;my-local-server&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;annotations&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Causes Agones to register your local game server at 192.1.1.2, replace with your server&amp;#39;s IP address.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;agones.dev/dev-address&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;192.1.1.2&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;ports&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;default&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;portPolicy&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;Static&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;hostPort&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;17654&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;containerPort&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;17654&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# The following is ignored but required due to validation.&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;template&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;containers&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;simple-udp&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;image&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;gcr.io/agones-images/udp-server&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0.21&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Once you save this to a file make sure you have &lt;code&gt;kubectl&lt;/code&gt; configured to point to your Agones cluster and then run &lt;code&gt;kubectl apply -f dev-gameserver.yaml&lt;/code&gt;. This will register your server with Agones.&lt;/p&gt;

&lt;p&gt;Local Game Servers has a few limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PortPolicy must be &lt;code&gt;Static&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The game server is not managed by Agones. Features like autoscaling, replication, etc are not available.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you are finished working with your server, you can remove the registration with &lt;code&gt;kubectl delete -f dev-gameserver.yaml&lt;/code&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Latency Testing with Multiple Clusters</title>
      <link>/site/docs/guides/ping-service/</link>
      <pubDate>Thu, 03 Jan 2019 01:20:30 +0000</pubDate>
      
      <guid>/site/docs/guides/ping-service/</guid>
      <description>
        
        
        

&lt;p&gt;To make latency testing easier, Agones installs with a simple ping service with both HTTP and UDP services that can be called
  for the purpose of timing how long the roundtrip takes for information to be returned from either of these services.&lt;/p&gt;

&lt;h2 id=&#34;installing&#34;&gt;Installing&lt;/h2&gt;

&lt;p&gt;By default, Agones installs &lt;a href=&#34;https://kubernetes.io/docs/concepts/services-networking/service/&#34;&gt;Kubernetes Services&lt;/a&gt; for
both HTTP and the UDP ping endpoints. These can be disabled entirely,
or disabled individually. See the &lt;a href=&#34;/site/site/docs/installation/install-agones/helm/&#34;&gt;Helm install guide&lt;/a&gt; for the parameters to
 pass through,
as well as configuration options.&lt;/p&gt;

&lt;p&gt;The ping services as all installed under the &lt;code&gt;agones-system&lt;/code&gt; namespace.&lt;/p&gt;

&lt;h2 id=&#34;http-service&#34;&gt;HTTP Service&lt;/h2&gt;

&lt;p&gt;This exposes an endpoint that returns a simple text HTTP response on request to the root &amp;ldquo;/&amp;rdquo; path. By default this is &lt;code&gt;ok&lt;/code&gt;, but
it can be configured via the &lt;code&gt;agones.ping.http.response&lt;/code&gt; parameter.&lt;/p&gt;

&lt;p&gt;This could be useful for providing clusters
with unique lookup names, such that clients are able to identify clusters from their responses.&lt;/p&gt;

&lt;p&gt;To lookup the details of this service, run &lt;code&gt;kubectl describe service agones-ping-http-service --namespace=agones-system&lt;/code&gt;&lt;/p&gt;

&lt;h2 id=&#34;udp-service&#34;&gt;UDP Service&lt;/h2&gt;

&lt;p&gt;The UDP ping service is a rate limited UDP echo service that returns the udp packet that it receives to its designated
sender.&lt;/p&gt;

&lt;p&gt;Since UDP sender details can be spoofed, this service is rate limited to 20 requests per second,
per sender address, per running instance (default is 2).&lt;/p&gt;

&lt;p&gt;This rate limit can be raised or lowered via the Helm install parameter &lt;code&gt;agones.ping.udp.rateLimit&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;UDP packets are also limited to 1024 bytes in size.&lt;/p&gt;

&lt;p&gt;To lookup the details of this service, run &lt;code&gt;kubectl describe service agones-ping-udp-service --namespace=agones-system&lt;/code&gt;&lt;/p&gt;

&lt;h2 id=&#34;client-side-tooling&#34;&gt;Client side tooling&lt;/h2&gt;

&lt;p&gt;We deliberately didn&amp;rsquo;t provide any game client libraries, as all major languages and engines have capabilities
to send HTTP requests as well as UDP packets.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Quickstart: Create a Fleet Autoscaler with Webhook Policy</title>
      <link>/site/docs/getting-started/create-webhook-fleetautoscaler/</link>
      <pubDate>Wed, 02 Jan 2019 06:42:44 +0000</pubDate>
      
      <guid>/site/docs/getting-started/create-webhook-fleetautoscaler/</guid>
      <description>
        
        
        

&lt;p&gt;In some cases, your game servers may need to use custom logic for scaling your fleet that is more complex than what
can be expressed using the Buffer policy in the fleetautoscaler. This guide shows how you can extend Agones
with an autoscaler webhook to implement a custom autoscaling policy.&lt;/p&gt;

&lt;p&gt;When you use an autoscaler webhook the logic computing the number of target replicas is delegated to an external
HTTP/S endpoint, such as one provided by a Kubernetes deployment and service in the same cluster (as shown in the
examples below). The fleetautoscaler will send a request to the webhook autoscaler&amp;rsquo;s &lt;code&gt;/scale&lt;/code&gt; endpoint every sync
period (currently 30s) with a JSON body, and scale the target fleet based on the data that is returned.&lt;/p&gt;

&lt;h2 id=&#34;chapter-1-configuring-http-fleetautoscaler-webhook&#34;&gt;Chapter 1 Configuring HTTP fleetautoscaler webhook&lt;/h2&gt;

&lt;h3 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h3&gt;

&lt;p&gt;It is assumed that you have completed the instructions to &lt;a href=&#34;/site/site/docs/getting-started/create-fleet/&#34;&gt;Create a Game Server Fleet&lt;/a&gt; and have a running fleet of game servers.&lt;/p&gt;

&lt;h3 id=&#34;objectives&#34;&gt;Objectives&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Run a fleet&lt;/li&gt;
&lt;li&gt;Deploy the Webhook Pod and service for autoscaling&lt;/li&gt;
&lt;li&gt;Create a Fleet Autoscaler with Webhook policy type in Kubernetes using Agones custom resource&lt;/li&gt;
&lt;li&gt;Watch the Fleet scales up when allocating GameServers&lt;/li&gt;
&lt;li&gt;Watch the Fleet scales down after GameServer shutdown&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&#34;1-deploy-the-fleet&#34;&gt;1. Deploy the fleet&lt;/h4&gt;

&lt;p&gt;Run a fleet in a cluster:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/simple-udp/fleet.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&#34;2-deploy-a-webhook-service-for-autoscaling&#34;&gt;2. Deploy a Webhook service for autoscaling&lt;/h4&gt;

&lt;p&gt;In this step we would deploy an example webhook that will control the size of the fleet based on allocated gameservers
portion in a fleet. You can see the source code for this example webhook server 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/autoscaler-webhook/main.go&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;here&lt;/a&gt;
.
The fleetautoscaler would trigger this endpoint every 30 seconds. More details could be found 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/autoscaler-webhook/&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;also here&lt;/a&gt;
.
We need to create a pod which will handle HTTP requests with json payload
&lt;a href=&#34;/site/site/docs/reference/fleetautoscaler/#webhook-endpoint-specification&#34;&gt;&lt;code&gt;FleetAutoscaleReview&lt;/code&gt;&lt;/a&gt; and return back it
with &lt;a href=&#34;/site/site/docs/reference/fleetautoscaler/#webhook-endpoint-specification&#34;&gt;&lt;code&gt;FleetAutoscaleResponse&lt;/code&gt;&lt;/a&gt; populated.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Scale&lt;/code&gt; flag and &lt;code&gt;Replicas&lt;/code&gt; values returned in the &lt;code&gt;FleetAutoscaleResponse&lt;/code&gt; tells the FleetAutoscaler what target size the backing Fleet should be scaled up or down to. If &lt;code&gt;Scale&lt;/code&gt; is false - no scaling occurs.&lt;/p&gt;

&lt;p&gt;Run next command to create a service and a Webhook pod in a cluster:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/autoscaler-webhook/autoscaler-service.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To check that it is running and liveness probe is fine:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl describe pod autoscaler-webhook
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;Name:           autoscaler-webhook-86944884c4-sdtqh
Namespace:      default
Node:           gke-test-cluster-default-1c5dec79-h0tq/10.138.0.2
...
Status:         Running
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&#34;3-create-a-fleet-autoscaler&#34;&gt;3. Create a Fleet Autoscaler&lt;/h4&gt;

&lt;p&gt;Let&amp;rsquo;s create a Fleet Autoscaler using the following command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/webhookfleetautoscaler.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You should see a successful output similar to this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;fleetautoscaler.autoscaling.agones.dev &amp;quot;webhook-fleet-autoscaler&amp;quot; created
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This has created a FleetAutoscaler record inside Kubernetes.
It has the link to Webhook service we deployed above.&lt;/p&gt;

&lt;h4 id=&#34;4-see-the-fleet-and-autoscaler-status&#34;&gt;4. See the fleet and autoscaler status.&lt;/h4&gt;

&lt;p&gt;In order to track the list of gameservers which run in your fleet you can run this command in a separate terminal tab:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; watch &amp;quot;kubectl get gs -n default&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In order to get autoscaler status use the following command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl describe fleetautoscaler webhook-fleet-autoscaler
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It should look something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Name:         webhook-fleet-autoscaler
Namespace:    default
Labels:       &amp;lt;none&amp;gt;
Annotations:  kubectl.kubernetes.io/last-applied-configuration={&amp;quot;apiVersion&amp;quot;:
&amp;quot;autoscaling.agones.dev/v1&amp;quot;,&amp;quot;kind&amp;quot;:&amp;quot;FleetAutoscaler&amp;quot;,&amp;quot;metadata&amp;quot;:{&amp;quot;annotations&amp;quot;
:{},&amp;quot;name&amp;quot;:&amp;quot;webhook-fleet-autoscaler&amp;quot;,&amp;quot;namespace&amp;quot;:&amp;quot;default...
API Version:  autoscaling.agones.dev/v1
Kind:         FleetAutoscaler
etadata:
  Cluster Name:
  Creation Timestamp:  2018-12-22T12:52:23Z
  Generation:          1
  Resource Version:    2274579
  Self Link:           /apis/autoscaling.agones.dev/v1/namespaces/default/fleet
autoscalers/webhook-fleet-autoscaler
  UID:                 6d03eae4-05e8-11e9-84c2-42010a8a01c9
Spec:
  Fleet Name:  simple-udp
  Policy:
    Type:  Webhook
    Webhook:
      Service:
        Name:       autoscaler-webhook-service
        Namespace:  default
        Path:       scale
      URL:
Status:
  Able To Scale:     true
  Current Replicas:  2
  Desired Replicas:  2
  Last Scale Time:   &amp;lt;nil&amp;gt;
  Scaling Limited:   false
Events:              &amp;lt;none&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can see the status (able to scale, not limited), the last time the fleet was scaled (nil for never), current and desired fleet size.&lt;/p&gt;

&lt;p&gt;The autoscaler makes a query to a webhoook service deployed on step 1 and on response changing the target Replica size, and the fleet creates/deletes game server instances
to achieve that number. The convergence is achieved in time, which is usually measured in seconds.&lt;/p&gt;

&lt;h4 id=&#34;5-allocate-game-servers-from-the-fleet-to-trigger-scale-up&#34;&gt;5. Allocate Game Servers from the Fleet to trigger scale up&lt;/h4&gt;

&lt;p&gt;If you&amp;rsquo;re interested in more details for game server allocation, you should consult the &lt;a href=&#34;/site/site/docs/getting-started/create-fleet/&#34;&gt;Create a Game Server Fleet&lt;/a&gt; page.
Here we only interested in triggering allocations to see the autoscaler in action.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/simple-udp/gameserverallocation.yaml -o yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You should get in return the allocated game server details, which should end with something like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;status:
  address: 34.94.118.237
  gameServerName: simple-udp-v6jwb-6bzkz
  nodeName: gke-test-cluster-default-f11755a7-5km3
  ports:
  - name: default
    port: 7832
  state: Allocated
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note the address and port, you might need them later to connect to the server.&lt;/p&gt;

&lt;p&gt;Run the kubectl command one more time so that we have both servers allocated:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/simple-udp/gameserverallocation.yaml -o yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&#34;6-check-new-autoscaler-and-fleet-status&#34;&gt;6. Check new Autoscaler and Fleet status&lt;/h4&gt;

&lt;p&gt;Now let&amp;rsquo;s wait a few seconds to allow the autoscaler to detect the change in the fleet and check again its status&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl describe fleetautoscaler webhook-fleet-autoscaler
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The last part should look similar to this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Spec:
  Fleet Name:  simple-udp
  Policy:
    Type:  Webhook
    Webhook:
      Service:
        Name:       autoscaler-webhook-service
        Namespace:  default
        Path:       scale
      URL:
Status:
  Able To Scale:     true
  Current Replicas:  4
  Desired Replicas:  4
  Last Scale Time:   2018-12-22T12:53:47Z
  Scaling Limited:   false
Events:
  Type    Reason            Age   From                        Message
  ----    ------            ----  ----                        -------
  Normal  AutoScalingFleet  35s   fleetautoscaler-controller  Scaling fleet simple-udp from 2 to 4
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can see that the fleet size has increased in particular case doubled to 4 gameservers (based on our custom logic in our webhook), the autoscaler having compensated for the two allocated instances.
Last Scale Time has been updated and a scaling event has been logged.&lt;/p&gt;

&lt;p&gt;Double-check the actual number of game server instances and status by running:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; kubectl get gs -n default
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will get you a list of all the current &lt;code&gt;GameServers&lt;/code&gt; and their &lt;code&gt;Status &amp;gt; State&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NAME                     STATE       ADDRESS         PORT     NODE        AGE
simple-udp-dmkp4-8pkk2   Ready       35.247.13.175   7386     minikube     5m
simple-udp-dmkp4-b7x87   Allocated   35.247.13.175   7219     minikube     5m
simple-udp-dmkp4-r4qtt   Allocated   35.247.13.175   7220     minikube     5m
simple-udp-dmkp4-rsr6n   Ready       35.247.13.175   7297     minikube     5m
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&#34;7-check-downscaling-using-webhook-autoscaler-policy&#34;&gt;7. Check downscaling using Webhook Autoscaler policy&lt;/h4&gt;

&lt;p&gt;Based on our custom webhook deployed earlier, if the fraction of allocated replicas in whole Replicas count would be less than threshold (0.3) then the fleet would scale down by scaleFactor, in our example by 2.&lt;/p&gt;

&lt;p&gt;Note that the example webhook server has a limitation that it would not decrease fleet replica count under &lt;code&gt;minReplicasCount&lt;/code&gt;, which is equal to 2.&lt;/p&gt;

&lt;p&gt;We need to run EXIT command on one gameserver (Use IP address and port of the allocated gameserver from the previous step) in order to decrease the number of allocated gameservers in a fleet (&amp;lt;0.3).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nc -u 35.247.13.175 7220
EXIT
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Server would be in shutdown state.
Wait about 30 seconds.
Then you should see scaling down event in the output of next command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl describe fleetautoscaler webhook-fleet-autoscaler
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You should see these lines in events:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  Normal   AutoScalingFleet  11m                fleetautoscaler-controller  Scaling fleet simple-udp from 2 to 4
  Normal   AutoScalingFleet  1m                 fleetautoscaler-controller  Scaling fleet simple-udp from 4 to 2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And get gameservers command output:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl get gs -n default
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;NAME                     STATUS      ADDRESS          PORT     NODE       AGE
simple-udp-884fg-6q5sk   Ready       35.247.117.202   7373     minikube   5m
simple-udp-884fg-b7l58   Allocated   35.247.117.202   7766     minikube   5m
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&#34;8-cleanup&#34;&gt;8. Cleanup&lt;/h4&gt;

&lt;p&gt;You can delete the autoscaler service and associated resources with the following commands.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl delete -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/autoscaler-webhook/autoscaler-service.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Removing the fleet:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl delete -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/simple-udp/fleet.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;chapter-2-configuring-https-fleetautoscaler-webhook-with-ca-bundle&#34;&gt;Chapter 2 Configuring HTTPS fleetautoscaler webhook with CA Bundle&lt;/h2&gt;

&lt;h3 id=&#34;objectives-1&#34;&gt;Objectives&lt;/h3&gt;

&lt;p&gt;Using TLS and a certificate authority (CA) bundle we can establish trusted communication between Fleetautoscaler and
an HTTPS server running the autoscaling webhook that controls the size of the fleet (Replicas count). The certificate of the
autoscaling webhook must be signed by the CA provided in fleetautoscaler yaml configuration file. Using TLS eliminates
the possibility of a man-in-the-middle attack between the fleetautoscaler and the autoscaling webhook.&lt;/p&gt;

&lt;h4 id=&#34;1-deploy-the-fleet-1&#34;&gt;1. Deploy the fleet&lt;/h4&gt;

&lt;p&gt;Run a fleet in a cluster:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/simple-udp/fleet.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&#34;2-create-x509-root-and-webhook-certificates&#34;&gt;2. Create X509 Root and Webhook certificates&lt;/h4&gt;

&lt;p&gt;The procedure of generating a Self-signed CA certificate taken from &lt;a href=&#34;https://datacenteroverlords.com/2012/03/01/creating-your-own-ssl-certificate-authority/&#34;&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first step is to create the private root key:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;openssl genrsa -out rootCA.key 2048
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The next step is to self-sign this certificate:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will start an interactive script that will ask you for various bits of information. Fill it out as you see fit.&lt;/p&gt;

&lt;p&gt;Every webhook that you wish to install a trusted certificate will need to go through this process. First, just like with the root CA step, you’ll need to create a private key (different from the root CA):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;openssl genrsa -out webhook.key 2048
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Once the key is created, you’ll generate the certificate signing request, use valid hostname which is &lt;code&gt;autoscaler-tls-service.default.svc&lt;/code&gt; as &lt;code&gt;Common Name (eg, fully qualified host name)&lt;/code&gt; when prompted:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;openssl req -new -key webhook.key -out webhook.csr
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Once that’s done, you’ll sign the CSR, which requires the CA root key:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;openssl x509 -req -in webhook.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out webhook.crt -days 500 -sha256
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This would generate webhook.crt certificate&lt;/p&gt;

&lt;p&gt;Add secret which later would be mounted to autoscaler-webhook-tls pod.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl create secret tls autoscalersecret --cert=webhook.crt --key=webhook.key
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You need to put Base64-encoded string into caBundle field in your fleetautoscaler yaml configuration:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;base64 -i ./rootCA.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Copy the output of the command above and replace the caBundle field in your text editor (say vim) with the new value:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;wget https://raw.githubusercontent.com/googleforgames/agones/master/examples/webhookfleetautoscalertls.yaml
vim ./webhookfleetautoscalertls.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&#34;3-deploy-a-webhook-service-for-autoscaling&#34;&gt;3. Deploy a Webhook service for autoscaling&lt;/h4&gt;

&lt;p&gt;Run next command to create a service and a Webhook pod in a cluster:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/autoscaler-webhook/autoscaler-service-tls.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To check that it is running and liveness probe is fine:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl describe pod autoscaler-webhook-tls
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Wait for the Running status results:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Name:               autoscaler-webhook-tls-f74c9bff7-ssrsc
Namespace:          default
...
Status:         Running
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&#34;4-create-a-fleet-autoscaler&#34;&gt;4. Create a Fleet Autoscaler&lt;/h4&gt;

&lt;p&gt;Let&amp;rsquo;s create a Fleet Autoscaler using the following command (caBundle should be set properly on Step 2):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl apply -f ./webhookfleetautoscalertls.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&#34;5-see-the-fleet-and-autoscaler-status&#34;&gt;5. See the fleet and autoscaler status.&lt;/h4&gt;

&lt;p&gt;In order to track the list of gameservers which run in your fleet you can run this command in a separate terminal tab:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; watch &amp;quot;kubectl get gs -n default&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&#34;6-allocate-two-game-servers-from-the-fleet-to-trigger-scale-up&#34;&gt;6. Allocate two Game Servers from the Fleet to trigger scale up&lt;/h4&gt;

&lt;p&gt;If you&amp;rsquo;re interested in more details for game server allocation, you should consult the &lt;a href=&#34;/site/site/docs/getting-started/create-fleet/&#34;&gt;Create a Game Server Fleet&lt;/a&gt; page.
Here we only interested in triggering allocations to see the autoscaler in action.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;for i in {0..1} ; do kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/simple-udp/gameserverallocation.yaml -o yaml ; done
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&#34;7-check-new-autoscaler-and-fleet-status&#34;&gt;7. Check new Autoscaler and Fleet status&lt;/h4&gt;

&lt;p&gt;Now let&amp;rsquo;s wait a few seconds to allow the autoscaler to detect the change in the fleet and check again its status&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl describe fleetautoscaler  webhook-fleetautoscaler-tls
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The last part should look similar to this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-Spec:&#34; data-lang=&#34;Spec:&#34;&gt;  Fleet Name:  simple-udp
  Policy:
    Type:  Webhook
    Webhook:
      Ca Bundle:  LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN1RENDQWFBQ0NRQ29kcEFNbTlTd0pqQU5CZ2txaGtpRzl3MEJBUXNGQURBZU1Rc3dDUVlEVlFRR0V3SlYKVXpFUE1BMEdBMVVFQ3d3R1FXZHZibVZ6TUI0WERURTVNREV3TkRFeE5URTBORm9YRFRJeE1UQXlOREV4TlRFMApORm93SGpFTE1Ba0dBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBc01Ca0ZuYjI1bGN6Q0NBU0l3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOQ0h5dndDOTZwZDlTdkFhMUIvRWg2ekcxeDBLS1dPaVhtNzhJcngKKzZ5WHd5YVpsMVo1cVExbUZoOThMSGVZUmQwWVgzRTJnelZ5bFpvUlUra1ZESzRUc0VzV0tNUFVpdVo0MUVrdApwbythbEN6alAyaXZzRGZaOGEvdnByL3dZZ2FrWGtWalBUaGpKUk9xTnFIdWROMjZVcUFJYnNOTVpoUkxkOVFFCnFLSjRPNmFHNVMxTVNqZFRGVHFlbHJiZitDcXNKaHltZEIzZmxGRUVvdXExSmoxS0RoQjRXWlNTbS9VSnpCNkcKNHUzY3BlQm1jTFVRR202ZlFHb2JFQSt5SlpMaEVXcXBrd3ZVZ2dCNmRzWE8xZFNIZXhhZmlDOUVUWGxVdFRhZwo1U2JOeTVoYWRWUVV3Z253U0J2djR2R0t1UUxXcWdXc0JyazB5Wll4Sk5Bb0V5RUNBd0VBQVRBTkJna3Foa2lHCjl3MEJBUXNGQUFPQ0FRRUFRMkgzaWJRcWYzQTNES2l1eGJISURkbll6TlZ2Z0dhRFpwaVZyM25ocm55dmxlNVgKR09hRm0rMjdRRjRWV29FMzZDTGhYZHpEWlM4bEpIY09YUW5KOU83Y2pPYzkxVmh1S2NmSHgwS09hU1oweVNrVAp2bEtXazlBNFdoNGE0QXFZSlc3Z3BUVHR1UFpydnc4VGsvbjFaWEZOYVdBeDd5RU5OdVdiODhoNGRBRDVaTzRzCkc5SHJIdlpuTTNXQzFBUXA0Q3laRjVyQ1I2dkVFOWRkUmlKb3IzM3pLZTRoRkJvN0JFTklZZXNzZVlxRStkcDMKK0g4TW5LODRXeDFUZ1N5Vkp5OHlMbXFpdTJ1aThjaDFIZnh0OFpjcHg3dXA2SEZLRlRsTjlBeXZUaXYxYTBYLwpEVTk1eTEwdi9oTlc0WHpuMDJHNGhrcjhzaUduSEcrUEprT3hBdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
      Service:    &amp;lt;nil&amp;gt;
      URL:        https://autoscaler-tls-service.default.svc:8000/scale
Events:
  Type    Reason            Age   From                        Message
  ----    ------            ----  ----                        -------
  Normal  AutoScalingFleet  5s   fleetautoscaler-controller  Scaling fleet simple-udp from 2 to 4&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can see that the fleet size has increased in particular case doubled to 4 gameservers (based on our custom logic in our webhook), the autoscaler having compensated for the two allocated instances.
Last Scale Time has been updated and a scaling event has been logged.&lt;/p&gt;

&lt;p&gt;Double-check the actual number of game server instances and status by running:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; kubectl get gs -n default
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will get you a list of all the current &lt;code&gt;GameServers&lt;/code&gt; and their &lt;code&gt;Status &amp;gt; State&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NAME                     STATE       ADDRESS         PORT      NODE      AGE
simple-udp-njmr7-2t4nx   Ready       35.203.159.68   7330      minikube   1m
simple-udp-njmr7-65rp6   Allocated   35.203.159.68   7294      minikube   4m
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&#34;8-cleanup-1&#34;&gt;8. Cleanup&lt;/h4&gt;

&lt;p&gt;You can delete the autoscaler service and associated resources with the following commands.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl delete -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/autoscaler-webhook/autoscaler-service-tls.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Removing x509 key secret:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl delete secret autoscalersecret
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Removing the fleet:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl delete -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/simple-udp/fleet.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;comments&#34;&gt;Comments&lt;/h3&gt;

&lt;p&gt;Note that secure communication has been established and we can trust that communication between the fleetautoscaler and
the autoscaling webhook. If you need to run the autoscaling webhook outside of the Kubernetes cluster, you can use
another root certificate authority as long as you put it into the caBundle parameter in fleetautoscaler configuration
(in pem format, base64-encoded).&lt;/p&gt;

&lt;h2 id=&#34;troubleshooting-guide&#34;&gt;Troubleshooting Guide&lt;/h2&gt;

&lt;p&gt;If you run into problems with the configuration of your fleetautoscaler and webhook service the easiest way to debug
them is to run:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl describe fleetautoscaler &amp;lt;FleetAutoScalerName&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and inspect the events at the bottom of the output.&lt;/p&gt;

&lt;h3 id=&#34;common-error-messages&#34;&gt;Common error messages.&lt;/h3&gt;

&lt;p&gt;If you have configured the wrong service Path for the FleetAutoscaler you will see a message like&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Error calculating desired fleet size on FleetAutoscaler simple-fleet-r7fdv-autoscaler. Error: bad status code 404 from the server: https://autoscaler-tls-service.default.svc:8000/scale
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you are using a hostname other than &lt;code&gt;autoscaler-tls-service.default.svc&lt;/code&gt; as the
&lt;code&gt;Common Name (eg, fully qualified host name)&lt;/code&gt; when creating a certificate using &lt;code&gt;openssl&lt;/code&gt; tool you will see a
message like&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Post https://autoscaler-tls-service.default.svc:8000/scale: x509: certificate is not valid for any names, but wanted to match autoscaler-tls-service.default.svc
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you see errors like the following in &lt;code&gt;autoscaler-webhook-tls&lt;/code&gt; pod logs:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http: TLS handshake error from 10.48.3.125:33374: remote error: tls: bad certificate
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then there could be an issue with your &lt;code&gt;./rootCA.pem&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can repeat the process from step 2, in order to fix your certificates setup.&lt;/p&gt;

&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h2&gt;

&lt;p&gt;Read the advanced &lt;a href=&#34;/site/site/docs/advanced/scheduling-and-autoscaling/&#34;&gt;Scheduling and Autoscaling&lt;/a&gt; guide, for more details on autoscaling.&lt;/p&gt;

&lt;p&gt;If you want to use your own GameServer container make sure you have properly integrated the &lt;a href=&#34;/site/site/docs/guides/client-sdks/&#34;&gt;Agones SDK&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: C# Game Server Client SDK</title>
      <link>/site/docs/guides/client-sdks/csharp/</link>
      <pubDate>Thu, 28 May 2020 00:00:00 +0000</pubDate>
      
      <guid>/site/docs/guides/client-sdks/csharp/</guid>
      <description>
        
        
        



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
The C# SDK will also be available as a NuGet package in a future release.
&lt;/div&gt;


&lt;p&gt;Check the &lt;a href=&#34;/site/site/docs/guides/client-sdks/&#34;&gt;Client SDK Documentation&lt;/a&gt; for more details on each of the SDK functions and how to run the SDK locally.&lt;/p&gt;

&lt;h2 id=&#34;download&#34;&gt;Download&lt;/h2&gt;

&lt;p&gt;Download the source 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/sdks/csharp&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;directly from GitHub&lt;/a&gt;
.&lt;/p&gt;

&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;.Net Standard 2.0 compliant framework.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;

&lt;p&gt;Reference the SDK in your project &amp;amp; create a new instance of the SDK wrapper:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;AgonesSDK&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To connect to the SDK server, either locally or when running on Agones, run the &lt;code&gt;ConnectAsync()&lt;/code&gt; method.
This will wait for up to 30 seconds if the SDK server has not yet started and the connection cannot be made,
and will return &lt;code&gt;false&lt;/code&gt; if there was an issue connecting.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ok&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ConnectAsync&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To mark the game server as &lt;a href=&#34;/site/site/docs/guides/client-sdks/#ready&#34;&gt;ready to receive player connections&lt;/a&gt;, call the async method &lt;code&gt;ReadyAsync()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;SomeMethod&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;
&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ReadyAsync&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To send &lt;code&gt;Health&lt;/code&gt; pings, call the async method &lt;code&gt;HealthAsync()&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;HealthAsync&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To get the details on the &lt;a href=&#34;/site/site/docs/guides/client-sdks/#gameserver&#34;&gt;backing &lt;code&gt;GameServer&lt;/code&gt;&lt;/a&gt; call &lt;code&gt;GetGameServerAsync()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Will return &lt;code&gt;null&lt;/code&gt; if there is an error in retrieving the &lt;code&gt;GameServer&lt;/code&gt; record.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;gameserver&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GetGameServerAsync&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To mark the GameServer as &lt;a href=&#34;/site/site/docs/guides/client-sdks/#reserve-seconds&#34;&gt;Reserved&lt;/a&gt; for a duration call
&lt;code&gt;ReserveAsync(long duration)&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;duration&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;30&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ReserveAsync&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;duration&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To mark that the &lt;a href=&#34;/site/site/docs/guides/client-sdks/#shutdown&#34;&gt;game session is completed&lt;/a&gt; and the game server should be shut down call &lt;code&gt;ShutdownAsync()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ShutdownAsync&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Similarly &lt;code&gt;SetAnnotation(string key, string value)&lt;/code&gt; and &lt;code&gt;SetLabel(string key, string value)&lt;/code&gt; are async methods that perform an action &amp;amp; return a &lt;code&gt;Status&lt;/code&gt; object.&lt;/p&gt;

&lt;p&gt;To watch when
&lt;a href=&#34;/site/site/docs/guides/client-sdks/#watchgameserver-function-gameserver&#34;&gt;the backing &lt;code&gt;GameServer&lt;/code&gt; configuration changes&lt;/a&gt;
call &lt;code&gt;WatchGameServer(callback)&lt;/code&gt;, where the delegate function &lt;code&gt;callback&lt;/code&gt; of type &lt;code&gt;Action&amp;lt;GameServer&amp;gt;&lt;/code&gt; will be executed every time the &lt;code&gt;GameServer&lt;/code&gt;
configuration changes.
This process is non-blocking internally.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;agonesSDK&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WatchGameServer&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;((&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;gameServer&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Console&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WriteLine&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;$&amp;#34;Server - Watch {gameServer}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;remarks&#34;&gt;Remarks&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;All requests other than &lt;code&gt;ConnectAsync&lt;/code&gt; will wait for up to 15 seconds before giving up, can also be set in the constructor.&lt;/li&gt;
&lt;li&gt;Default host &amp;amp; port are &lt;code&gt;localhost:9357&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Methods that do not return a data object such as &lt;code&gt;GameServer&lt;/code&gt; will return a gRPC &lt;code&gt;Status&lt;/code&gt; object. To check the state of the request, check &lt;code&gt;Status.StatusCode&lt;/code&gt; &amp;amp; &lt;code&gt;Status.Detail&lt;/code&gt;.
Ex:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;StatusCode&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;StatusCode&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;OK&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;//do stuff
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Node.js Game Server Client SDK</title>
      <link>/site/docs/guides/client-sdks/nodejs/</link>
      <pubDate>Sun, 24 Feb 2019 15:56:57 +0000</pubDate>
      
      <guid>/site/docs/guides/client-sdks/nodejs/</guid>
      <description>
        
        
        

&lt;p&gt;Check the &lt;a href=&#34;/site/site/docs/guides/client-sdks/&#34;&gt;Client SDK Documentation&lt;/a&gt; for more details on each of the SDK functions and how to run the SDK locally.&lt;/p&gt;

&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Node.js &amp;gt;= 10.13.0&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;

&lt;p&gt;Add the agones dependency to your project:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;$ npm install @google-cloud/agones-sdk&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you need to download the source, rather than install from NPM, you can find it on

&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/sdks/nodejs&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;GitHub&lt;/a&gt;
.&lt;/p&gt;

&lt;p&gt;To begin working with the SDK, create an instance of it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;AgonesSDK&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;@google-cloud/agones-sdk&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;

&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agonesSDK&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;AgonesSDK&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To connect to the SDK server, either local or when running on Agones, run the &lt;code&gt;async&lt;/code&gt; method &lt;code&gt;sdk.connect()&lt;/code&gt;, which will
&lt;code&gt;resolve&lt;/code&gt; once connected or &lt;code&gt;reject&lt;/code&gt; on error or if no connection can be made after 30 seconds.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agonesSDK&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;connect&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To send a &lt;a href=&#34;/site/site/docs/guides/client-sdks/#health&#34;&gt;health check&lt;/a&gt; ping call &lt;code&gt;health()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;agonesSDK&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;health&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To mark the game server as &lt;a href=&#34;/site/site/docs/guides/client-sdks/#ready&#34;&gt;ready to receive player connections&lt;/a&gt;, call the async method &lt;code&gt;ready()&lt;/code&gt;. The result will be an empty object in this case.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;result&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agonesSDK&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ready&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Similarly &lt;code&gt;shutdown()&lt;/code&gt;, &lt;code&gt;allocate()&lt;/code&gt;, &lt;code&gt;setAnnotation(key, value)&lt;/code&gt; and &lt;code&gt;setLabel(key, value)&lt;/code&gt; are async methods that perform an action and return an empty result.&lt;/p&gt;

&lt;p&gt;To get &lt;a href=&#34;/site/site/docs/guides/client-sdks/#gameserver&#34;&gt;details of the backing GameServer&lt;/a&gt; call the async method
&lt;code&gt;getGameServer()&lt;/code&gt;. The result will be an object representing &lt;code&gt;GameServer&lt;/code&gt; defined
in 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/proto/sdk/sdk.proto&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;`sdk.proto`&lt;/a&gt;
.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;result&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agonesSDK&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;getGameServer&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To get &lt;a href=&#34;/site/site/docs/guides/client-sdks/#watchgameserver-function-gameserver&#34;&gt;updates on the backing GameServer&lt;/a&gt; as they happen, call &lt;code&gt;watchGameServer(callback)&lt;/code&gt;. The callback will be called with a parameter matching the result of &lt;code&gt;getGameServer()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;agonesSDK&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;watchGameServer&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;((&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;result&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
	&lt;span style=&#34;color:#000&#34;&gt;console&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;log&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;watch&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;result&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To mark the game server as &lt;a href=&#34;/site/site/docs/guides/client-sdks/#reserve-seconds&#34;&gt;reserved&lt;/a&gt; for a period of time, call the async method &lt;code&gt;reserve(seconds)&lt;/code&gt;. The result will be an empty object.&lt;/p&gt;

&lt;p&gt;For more information, please read the &lt;a href=&#34;/site/site/docs/guides/client-sdks/&#34;&gt;SDK Overview&lt;/a&gt;, check out 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/sdks/nodejs/src/agonesSDK.js&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;agonesSDK.js&lt;/a&gt;
 and also look at the 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/nodejs-simple&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Node.js example&lt;/a&gt;
.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Metrics</title>
      <link>/site/docs/guides/metrics/</link>
      <pubDate>Thu, 03 Jan 2019 03:58:19 +0000</pubDate>
      
      <guid>/site/docs/guides/metrics/</guid>
      <description>
        
        
        

&lt;p&gt;Agones controller exposes metrics via &lt;a href=&#34;https://opencensus.io/&#34;&gt;OpenCensus&lt;/a&gt;. OpenCensus is a single distribution of libraries that collect metrics and distributed traces from your services, we only use it for metrics but it will allow us to support multiple exporters in the future.&lt;/p&gt;

&lt;p&gt;We choose to start with &lt;a href=&#34;https://prometheus.io/&#34;&gt;Prometheus&lt;/a&gt; as this is the most popular with Kubernetes but it is also compatible with Stackdriver.
If you need another exporter, check the &lt;a href=&#34;https://opencensus.io/exporters/supported-exporters/go/&#34;&gt;list of supported&lt;/a&gt; exporters. It should be pretty straightforward to register a new one. (GitHub PRs are more than welcome.)&lt;/p&gt;

&lt;p&gt;We plan to support multiple exporters in the future via environment variables and helm flags.&lt;/p&gt;

&lt;h2 id=&#34;backend-integrations&#34;&gt;Backend integrations&lt;/h2&gt;

&lt;h3 id=&#34;prometheus&#34;&gt;Prometheus&lt;/h3&gt;

&lt;p&gt;If you are running a &lt;a href=&#34;https://prometheus.io/&#34;&gt;Prometheus&lt;/a&gt; instance you just need to ensure that metrics and kubernetes service discovery are enabled. (helm chart values &lt;code&gt;agones.metrics.prometheusEnabled&lt;/code&gt; and &lt;code&gt;agones.metrics.prometheusServiceDiscovery&lt;/code&gt;). This will automatically add annotations required by Prometheus to discover Agones metrics and start collecting them. (see &lt;a href=&#34;https://github.com/prometheus/prometheus/tree/master/documentation/examples/kubernetes-rabbitmq&#34;&gt;example&lt;/a&gt;)&lt;/p&gt;

&lt;h3 id=&#34;prometheus-operator&#34;&gt;Prometheus Operator&lt;/h3&gt;

&lt;p&gt;If you have &lt;a href=&#34;https://github.com/coreos/prometheus-operator&#34;&gt;Prometheus operator&lt;/a&gt; installed in your cluster, make sure to add a &lt;a href=&#34;https://github.com/coreos/prometheus-operator/blob/v0.17.0/Documentation/api.md#servicemonitorspec&#34;&gt;&lt;code&gt;ServiceMonitor&lt;/code&gt;&lt;/a&gt; to discover Agones metrics as shown below:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;apiVersion&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;monitoring.coreos.com/v1&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;kind&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;ServiceMonitor&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;metadata&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;agones&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;labels&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;app&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;agones&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;selector&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;matchLabels&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;agones.dev/role&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;controller&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;endpoints&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;port&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;web&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finally include that &lt;code&gt;ServiceMonitor&lt;/code&gt; in your &lt;a href=&#34;https://github.com/coreos/prometheus-operator/blob/v0.17.0/Documentation/user-guides/getting-started.md#include-servicemonitors&#34;&gt;Prometheus instance CRD&lt;/a&gt;, this is usually done by adding a label to the &lt;code&gt;ServiceMonitor&lt;/code&gt; above that is matched by the prometheus instance of your choice.&lt;/p&gt;

&lt;h3 id=&#34;stackdriver&#34;&gt;Stackdriver&lt;/h3&gt;

&lt;p&gt;We support the &lt;a href=&#34;https://opencensus.io/exporters/supported-exporters/go/stackdriver/&#34;&gt;OpenCensus Stackdriver exporter&lt;/a&gt;.
In order to use it you should enable &lt;a href=&#34;https://cloud.google.com/monitoring/api/enable-api&#34;&gt;Stackdriver Monitoring API&lt;/a&gt; in Google Cloud Console.
Follow the &lt;a href=&#34;#stackdriver-installation&#34;&gt;Stackdriver Installation steps&lt;/a&gt; to see your metrics on Stackdriver Monitoring website.&lt;/p&gt;

&lt;h2 id=&#34;metrics-available&#34;&gt;Metrics available&lt;/h2&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;agones_gameservers_count&lt;/td&gt;
&lt;td&gt;The number of gameservers per fleet and status&lt;/td&gt;
&lt;td&gt;gauge&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_gameserver_allocations_duration_seconds&lt;/td&gt;
&lt;td&gt;The distribution of gameserver allocation requests latencies&lt;/td&gt;
&lt;td&gt;histogram&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_gameservers_total&lt;/td&gt;
&lt;td&gt;The total of gameservers per fleet and status&lt;/td&gt;
&lt;td&gt;counter&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_fleets_replicas_count&lt;/td&gt;
&lt;td&gt;The number of replicas per fleet (total, desired, ready, allocated)&lt;/td&gt;
&lt;td&gt;gauge&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_fleet_autoscalers_able_to_scale&lt;/td&gt;
&lt;td&gt;The fleet autoscaler can access the fleet to scale&lt;/td&gt;
&lt;td&gt;gauge&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_fleet_autoscalers_buffer_limits&lt;/td&gt;
&lt;td&gt;The limits of buffer based fleet autoscalers (min, max)&lt;/td&gt;
&lt;td&gt;gauge&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_fleet_autoscalers_buffer_size&lt;/td&gt;
&lt;td&gt;The buffer size of fleet autoscalers (count or percentage)&lt;/td&gt;
&lt;td&gt;gauge&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_fleet_autoscalers_current_replicas_count&lt;/td&gt;
&lt;td&gt;The current replicas count as seen by autoscalers&lt;/td&gt;
&lt;td&gt;gauge&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_fleet_autoscalers_desired_replicas_count&lt;/td&gt;
&lt;td&gt;The desired replicas count as seen by autoscalers&lt;/td&gt;
&lt;td&gt;gauge&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_fleet_autoscalers_limited&lt;/td&gt;
&lt;td&gt;The fleet autoscaler is capped (1)&lt;/td&gt;
&lt;td&gt;gauge&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_gameservers_node_count&lt;/td&gt;
&lt;td&gt;The distribution of gameservers per node&lt;/td&gt;
&lt;td&gt;histogram&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_nodes_count&lt;/td&gt;
&lt;td&gt;The count of nodes empty and with gameservers&lt;/td&gt;
&lt;td&gt;gauge&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_k8s_client_http_request_total&lt;/td&gt;
&lt;td&gt;The total of HTTP requests to the Kubernetes API by status code&lt;/td&gt;
&lt;td&gt;counter&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_k8s_client_http_request_duration_seconds&lt;/td&gt;
&lt;td&gt;The distribution of HTTP requests latencies to the Kubernetes API by status code&lt;/td&gt;
&lt;td&gt;histogram&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_k8s_client_cache_list_total&lt;/td&gt;
&lt;td&gt;The total number of list operations for client-go caches&lt;/td&gt;
&lt;td&gt;counter&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_k8s_client_cache_list_duration_seconds&lt;/td&gt;
&lt;td&gt;Duration of a Kubernetes list API call in seconds&lt;/td&gt;
&lt;td&gt;histogram&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_k8s_client_cache_list_items&lt;/td&gt;
&lt;td&gt;Count of items in a list from the Kubernetes API&lt;/td&gt;
&lt;td&gt;histogram&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_k8s_client_cache_watches_total&lt;/td&gt;
&lt;td&gt;The total number of watch operations for client-go caches&lt;/td&gt;
&lt;td&gt;counter&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_k8s_client_cache_last_resource_version&lt;/td&gt;
&lt;td&gt;Last resource version from the Kubernetes API&lt;/td&gt;
&lt;td&gt;gauge&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_k8s_client_workqueue_depth&lt;/td&gt;
&lt;td&gt;Current depth of the work queue&lt;/td&gt;
&lt;td&gt;gauge&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_k8s_client_workqueue_latency_seconds&lt;/td&gt;
&lt;td&gt;How long an item stays in the work queue&lt;/td&gt;
&lt;td&gt;histogram&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_k8s_client_workqueue_items_total&lt;/td&gt;
&lt;td&gt;Total number of items added to the work queue&lt;/td&gt;
&lt;td&gt;counter&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_k8s_client_workqueue_work_duration_seconds&lt;/td&gt;
&lt;td&gt;How long processing an item from the work queue takes&lt;/td&gt;
&lt;td&gt;histogram&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_k8s_client_workqueue_retries_total&lt;/td&gt;
&lt;td&gt;Total number of items retried to the work queue&lt;/td&gt;
&lt;td&gt;counter&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_k8s_client_workqueue_longest_running_processor&lt;/td&gt;
&lt;td&gt;How long the longest running workqueue processor has been running in microseconds&lt;/td&gt;
&lt;td&gt;gauge&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;agones_k8s_client_workqueue_unfinished_work_seconds&lt;/td&gt;
&lt;td&gt;How long unfinished work has been sitting in the workqueue in seconds&lt;/td&gt;
&lt;td&gt;gauge&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;dashboard&#34;&gt;Dashboard&lt;/h2&gt;

&lt;h3 id=&#34;grafana-dashboards&#34;&gt;Grafana Dashboards&lt;/h3&gt;

&lt;p&gt;We provide a set of useful &lt;a href=&#34;https://grafana.com/&#34;&gt;Grafana&lt;/a&gt; dashboards to monitor Agones workload, they are located under the 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/grafana&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;grafana folder&lt;/a&gt;
:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/grafana/dashboard-autoscalers.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Agones Autoscalers&lt;/a&gt;
 allows you to monitor your current autoscalers replicas request as well as fleet replicas allocation and readyness statuses. You can only select one autoscaler at the time using the provided dropdown.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/grafana/dashboard-gameservers.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Agones GameServers&lt;/a&gt;
 displays your current game servers workload status (allocations, game servers statuses, fleets replicas) with optional fleet name filtering.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/grafana/dashboard-allocations.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Agones GameServer Allocations&lt;/a&gt;
 displays Agones gameservers allocations rates and counts per fleet.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/grafana/dashboard-allocator-usage.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Agones Allocator Resource&lt;/a&gt;
 displays Agones Allocators CPU, memory usage and also some useful Golang runtime metrics.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/grafana/dashboard-status.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Agones Status&lt;/a&gt;
 displays Agones controller health status.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/grafana/dashboard-controller-usage.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Agones Controller Resource Usage&lt;/a&gt;
 displays Agones Controller CPU and memory usage and also some Golang runtime metrics.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/grafana/dashboard-goclient-requests.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Agones Controller go-client requests&lt;/a&gt;
 displays Agones Controller Kubernetes API consumption.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/grafana/dashboard-goclient-caches.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Agones Controller go-client caches&lt;/a&gt;
 displays Agones Controller Kubernetes Watches/Lists operations used.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/grafana/dashboard-goclient-workqueues.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Agones Controller go-client workqueues&lt;/a&gt;
 displays Agones Controller workqueue processing time and rates.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/grafana/dashboard-apiserver-requests.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Agones Controller API Server requests&lt;/a&gt;
 displays your current API server request rate, errors rate and request latencies with optional CustomResourceDefinition filtering by Types: fleets, gameserversets, gameservers, gameserverallocations.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dashboard screenshots :&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;../../../images/grafana-dashboard-autoscalers.png&#34; alt=&#34;grafana dashboard autoscalers&#34; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;../../../images/grafana-dashboard-controller.png&#34; alt=&#34;grafana dashboard controller&#34; /&gt;&lt;/p&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
You can import our dashboards by copying the json content from
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/grafana&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;each config map&lt;/a&gt;
 into your own instance of Grafana (+ &amp;gt; Create &amp;gt; Import &amp;gt; Or paste json) or follow the &lt;a href=&#34;#installation&#34;&gt;installation&lt;/a&gt; guide.
&lt;/div&gt;


&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;/h2&gt;

&lt;p&gt;When operating a live multiplayer game you will need to observe performances, resource usage and availability to learn more about your system. This guide will explain how you can setup Prometheus and Grafana into your own Kubernetes cluster to monitor your Agones workload.&lt;/p&gt;

&lt;p&gt;Before attemping this guide you should make sure you have &lt;a href=&#34;https://kubernetes.io/docs/tasks/tools/install-kubectl/&#34;&gt;kubectl&lt;/a&gt; and &lt;a href=&#34;https://docs.helm.sh/using_helm/&#34;&gt;helm&lt;/a&gt; installed and configured to reach your kubernetes cluster.&lt;/p&gt;

&lt;h3 id=&#34;prometheus-installation&#34;&gt;Prometheus installation&lt;/h3&gt;

&lt;p&gt;Prometheus is an open source monitoring solution, we will use it to store Agones controller metrics and query back the data.&lt;/p&gt;

&lt;p&gt;Let&amp;rsquo;s install Prometheus using the &lt;a href=&#34;https://github.com/helm/charts/tree/master/stable/prometheus&#34;&gt;helm stable&lt;/a&gt; repository.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;helm upgrade --install --wait prom stable/prometheus --namespace metrics &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --set server.global.scrape_interval&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;30s &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --set server.persistentVolume.enabled&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;true&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --set server.persistentVolume.size&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;64Gi &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    -f ./build/prometheus.yaml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
You can also run our
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/Makefile&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Makefile&lt;/a&gt;
 target &lt;code&gt;make setup-prometheus&lt;/code&gt;
or &lt;code&gt;make kind-setup-prometheus&lt;/code&gt; and &lt;code&gt;make minikube-setup-prometheus&lt;/code&gt;
for
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/README.md#running-a-test-kind-cluster&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Kind&lt;/a&gt;
 and
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/README.md#running-a-test-minikube-cluster&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Minikube&lt;/a&gt;
.
&lt;/div&gt;


&lt;p&gt;For resiliency it is recommended to run Prometheus on a dedicated node which is separate from nodes where Game Servers
are scheduled. If you use the above command, with our 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/prometheus.yaml&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;prometheus.yaml&lt;/a&gt;
 to set up Prometheus, it will schedule Prometheus pods on nodes
tainted with &lt;code&gt;agones.dev/agones-metrics=true:NoExecute&lt;/code&gt; and labeled with &lt;code&gt;agones.dev/agones-metrics=true&lt;/code&gt; if available.&lt;/p&gt;

&lt;p&gt;As an example, to set up a dedicated node pool for Prometheus on GKE, run the following command before installing Prometheus. Alternatively you can taint and label nodes manually.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gcloud container node-pools create agones-metrics --cluster=... --zone=... \
  --node-taints agones.dev/agones-metrics=true:NoExecute \
  --node-labels agones.dev/agones-metrics=true \
  --num-nodes=1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;By default we will disable the push gateway (we don&amp;rsquo;t need it for Agones) and other exporters.&lt;/p&gt;

&lt;p&gt;The helm &lt;a href=&#34;https://github.com/helm/charts/tree/master/stable/prometheus&#34;&gt;chart&lt;/a&gt; support &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector&#34;&gt;nodeSelector&lt;/a&gt;, &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity&#34;&gt;affinity&lt;/a&gt; and &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/&#34;&gt;toleration&lt;/a&gt;, you can use them to schedule prometheus deployments on an isolated node(s) to have an homogeneous game servers workload.&lt;/p&gt;

&lt;p&gt;This will install a Prometheus Server in your current cluster with &lt;a href=&#34;https://kubernetes.io/docs/concepts/storage/persistent-volumes/&#34;&gt;Persistent Volume Claim&lt;/a&gt; (Deactivated for Minikube and Kind) for storing and querying time series, it will automatically start collecting metrics from Agones Controller.&lt;/p&gt;

&lt;p&gt;Finally to access Prometheus metrics, rules and alerts explorer use&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;kubectl port-forward deployments/prom-prometheus-server &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;9090&lt;/span&gt; -n metrics&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
Again you can use our Makefile
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/README.md#prometheus-portforward&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;&lt;code&gt;make prometheus-portforward&lt;/code&gt;&lt;/a&gt;
.
  (For
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/README.md#running-a-test-kind-cluster&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Kind&lt;/a&gt;
 and
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/README.md#running-a-test-minikube-cluster&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Minikube&lt;/a&gt;
 use their specific targets &lt;code&gt;make kind-prometheus-portforward&lt;/code&gt; and &lt;code&gt;make minikube-prometheus-portforward&lt;/code&gt;)
&lt;/div&gt;


&lt;p&gt;Now you can access the prometheus dashboard &lt;a href=&#34;http://localhost:9090&#34;&gt;http://localhost:9090&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On the landing page you can start exploring metrics by creating &lt;a href=&#34;https://prometheus.io/docs/prometheus/latest/querying/basics/&#34;&gt;queries&lt;/a&gt;. You can also verify what &lt;a href=&#34;http://localhost:9090/targets&#34;&gt;targets&lt;/a&gt; Prometheus currently monitors (Header Status &amp;gt; Targets), you should see Agones controller pod in the &lt;code&gt;kubernetes-pods&lt;/code&gt; section.&lt;/p&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
Metrics will be first registered when you will start using Agones.
&lt;/div&gt;


&lt;p&gt;Now let&amp;rsquo;s install some Grafana dashboards.&lt;/p&gt;

&lt;h3 id=&#34;grafana-installation&#34;&gt;Grafana installation&lt;/h3&gt;

&lt;p&gt;Grafana is a open source time series analytics platform which supports Prometheus data source. We can also easily import pre-built dashboards.&lt;/p&gt;

&lt;p&gt;First we will install &lt;a href=&#34;#grafana-dashboards&#34;&gt;Agones dashboard&lt;/a&gt; as &lt;a href=&#34;https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/&#34;&gt;config maps&lt;/a&gt; in our cluster.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;kubectl apply -f ./build/grafana/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we can install &lt;a href=&#34;https://github.com/helm/charts/tree/master/stable/grafana&#34;&gt;grafana chart&lt;/a&gt; from stable repository. (Replace &lt;code&gt;&amp;lt;your-admin-password&amp;gt;&lt;/code&gt; with the admin password of your choice)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;helm install --wait --name grafana stable/grafana --version&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;5&lt;/span&gt;.0.13 --namespace metrics &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --set &lt;span style=&#34;color:#000&#34;&gt;adminPassword&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&amp;lt;your-admin-password&amp;gt; -f ./build/grafana.yaml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will install Grafana with our prepopulated dashboards and prometheus datasource &lt;a href=&#34;#prometheus-installation&#34;&gt;previously installed&lt;/a&gt;&lt;/p&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
You can also use our
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master//build/Makefile&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Makefile&lt;/a&gt;
 targets (&lt;code&gt;setup-grafana&lt;/code&gt;, &lt;code&gt;minikube-setup-grafana&lt;/code&gt; and &lt;code&gt;kind-setup-grafana&lt;/code&gt;).
&lt;/div&gt;


&lt;p&gt;Finally to access dashboards run&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;kubectl port-forward deployments/grafana &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;3000&lt;/span&gt; -n metrics&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Open a web browser to &lt;a href=&#34;http://localhost:3000&#34;&gt;http://localhost:3000&lt;/a&gt;, you should see Agones &lt;a href=&#34;#grafana-dashboards&#34;&gt;dashboards&lt;/a&gt; after login as admin.&lt;/p&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
You can also use our &lt;code&gt;Makefile&lt;/code&gt; targets &lt;code&gt;make grafana-portforward&lt;/code&gt;, &lt;code&gt;make kind-grafana-portforward&lt;/code&gt; and &lt;code&gt;make minikube-grafana-portforward&lt;/code&gt;.
&lt;/div&gt;


&lt;h3 id=&#34;stackdriver-installation&#34;&gt;Stackdriver installation&lt;/h3&gt;

&lt;p&gt;In order to use &lt;a href=&#34;https://app.google.stackdriver.com&#34;&gt;Stackdriver monitoring&lt;/a&gt; you should &lt;a href=&#34;https://cloud.google.com/monitoring/api/enable-api&#34;&gt;enable Stackdriver Monitoring API&lt;/a&gt; on Google Cloud Console. You need to grant all the necessary permissions to the users (see &lt;a href=&#34;https://cloud.google.com/monitoring/access-control&#34;&gt;Access Control Guide&lt;/a&gt;). Stackdriver exporter uses a strategy called Application Default Credentials (ADC) to find your application&amp;rsquo;s credentials. Details could be found here &lt;a href=&#34;https://cloud.google.com/docs/authentication/production&#34;&gt;Setting Up Authentication for Server to Server Production Applications&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Note that Stackdriver monitoring is enabled by default on GKE clusters, however you can follow this &lt;a href=&#34;https://cloud.google.com/kubernetes-engine/docs/how-to/monitoring#enabling_stackdriver_monitoring&#34;&gt;guide&lt;/a&gt; if it was disabled on your GKE cluster.&lt;/p&gt;

&lt;p&gt;Default metrics exporter is Prometheus. If you are using the &lt;a href=&#34;/site/site/docs/installation/install-agones/helm/&#34;&gt;Helm installation&lt;/a&gt;, you can install or upgrade Agones to use Stackdriver, using the following chart parameters:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;helm upgrade --install --wait --set agones.metrics.stackdriverEnabled=true --set agones.metrics.prometheusEnabled=false --set agones.metrics.prometheusServiceDiscovery=false my-release-name agones/agones --namespace=agones-system
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With this configuration only Stackdriver exporter would be used instead of Prometheus exporter.&lt;/p&gt;

&lt;p&gt;Create a Fleet or a Gameserver in order to check that connection with stackdriver API is configured properly and so that you will be able to see the metrics data.&lt;/p&gt;

&lt;p&gt;Visit &lt;a href=&#34;https://app.google.stackdriver.com&#34;&gt;Stackdriver monitoring&lt;/a&gt; website, select your project, or choose &lt;code&gt;Create a new Workspace&lt;/code&gt; and select GCP project where your cluster resides. In &lt;a href=&#34;https://cloud.google.com/monitoring/charts/metrics-explorer&#34;&gt;Stackdriver metrics explorer&lt;/a&gt; you should be able to find new metrics with prefix &lt;code&gt;agones/&lt;/code&gt; after a couple of minutes. Choose the metrics you are interested in and add to a single or separate graphs. Select &lt;code&gt;Kubernetes Container&lt;/code&gt; resource type for each of them. You can create multiple graphs, save them into your dashboard and use various aggregation parameters and reducers for each graph.&lt;/p&gt;

&lt;p&gt;Example of the dashboard appearance is provided below:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;../../../images/stackdriver-metrics-dashboard.png&#34; alt=&#34;stackdriver monitoring dashboard&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Currently there exists only manual way of configuring Stackdriver Dashboard. So it is up to you to set an Alignment Period (minimal is 1 minute), GroupBy, Filter parameters and other graph settings.&lt;/p&gt;

&lt;h4 id=&#34;troubleshooting&#34;&gt;Troubleshooting&lt;/h4&gt;

&lt;p&gt;If you can&amp;rsquo;t see Agones metrics you should have a look at the controller logs for connection errors. Also ensure that your cluster has the necessary credentials to interact with Stackdriver Monitoring. You can configure &lt;code&gt;stackdriverProjectID&lt;/code&gt; manually, if the automatic discovery is not working.&lt;/p&gt;

&lt;p&gt;Permissions problem example from controller logs:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Failed to export to Stackdriver: rpc error: code = PermissionDenied desc = Permission monitoring.metricDescriptors.create denied (or the resource may not exist).
&lt;/code&gt;&lt;/pre&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Access Agones via the Kubernetes API</title>
      <link>/site/docs/guides/access-api/</link>
      <pubDate>Thu, 03 Jan 2019 01:20:41 +0000</pubDate>
      
      <guid>/site/docs/guides/access-api/</guid>
      <description>
        
        
        

&lt;p&gt;Installing Agones creates several &lt;a href=&#34;https://kubernetes.io/docs/concepts/api-extension/custom-resources&#34;&gt;Custom Resource Definitions (CRD)&lt;/a&gt;,
which can be accessed and manipulated through the Kubernetes API.&lt;/p&gt;

&lt;p&gt;The detailed list of Agones CRDs with their parameters could be found here - &lt;a href=&#34;../../reference/agones_crd_api_reference/&#34;&gt;Agones CRD API Reference&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Kubernetes has multiple &lt;a href=&#34;https://kubernetes.io/docs/reference/using-api/client-libraries/&#34;&gt;client libraries&lt;/a&gt;, however,
at time of writing, only
the &lt;a href=&#34;https://github.com/kubernetes/client-go&#34;&gt;Go&lt;/a&gt; and
&lt;a href=&#34;https://github.com/kubernetes-client/python/&#34;&gt;Python&lt;/a&gt; clients are documented to support accessing CRDs.&lt;/p&gt;

&lt;p&gt;This can be found in the &lt;a href=&#34;https://kubernetes.io/docs/concepts/api-extension/custom-resources/#accessing-a-custom-resource&#34;&gt;Accessing a custom resource&lt;/a&gt;
section of the Kubernetes documentation.&lt;/p&gt;

&lt;p&gt;At this time, we recommend interacting with Agones through the Go client that has been generated in this repository,
but other methods may also work as well.&lt;/p&gt;

&lt;h2 id=&#34;go-client&#34;&gt;Go Client&lt;/h2&gt;

&lt;p&gt;Kubernetes Go Client tooling generates a Client for Agones that we can use to interact with the Agones
installation on our Kubernetes cluster.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://pkg.go.dev/agones.dev/agones/pkg/client/clientset/versioned&#34;&gt;Godoc for the Agones Client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/kubernetes&#34;&gt;Godoc for the standard Kubernetes Client&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;authentication&#34;&gt;Authentication&lt;/h3&gt;

&lt;p&gt;This client uses the same authentication mechanisms as the Kubernetes API.&lt;/p&gt;

&lt;p&gt;If you plan to run your code in the same cluster as the Agones install, have a look at the
&lt;a href=&#34;https://github.com/kubernetes/client-go/tree/master/examples/in-cluster-client-configuration&#34;&gt;in cluster configuration&lt;/a&gt;
example from the Kubernetes Client.&lt;/p&gt;

&lt;p&gt;If you plan to run your code outside the Kubernetes cluster as your Agones install,
look at the &lt;a href=&#34;https://github.com/kubernetes/client-go/tree/master/examples/out-of-cluster-client-configuration&#34;&gt;out of cluster configuration&lt;/a&gt;
example from the Kubernetes client.&lt;/p&gt;

&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;p&gt;The following is an example of a in-cluster configuration, that creates a &lt;code&gt;Clientset&lt;/code&gt; for Agones
and then creates a &lt;code&gt;GameServer&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A full example code is available in the 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/crd-client/main.go&#34; target=&#34;_blank&#34; data-proofer-ignore&gt; example folder&lt;/a&gt;
.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;main&lt;/span&gt;

&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;
	&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;

	&lt;span style=&#34;color:#000&#34;&gt;agonesv1&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones.dev/agones/pkg/apis/agones/v1&amp;#34;&lt;/span&gt;
	&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones.dev/agones/pkg/client/clientset/versioned&amp;#34;&lt;/span&gt;
	&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones.dev/agones/pkg/util/runtime&amp;#34;&lt;/span&gt;
	&lt;span style=&#34;color:#000&#34;&gt;corev1&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;k8s.io/api/core/v1&amp;#34;&lt;/span&gt;
	&lt;span style=&#34;color:#000&#34;&gt;metav1&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;k8s.io/apimachinery/pkg/apis/meta/v1&amp;#34;&lt;/span&gt;
	&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;k8s.io/client-go/kubernetes&amp;#34;&lt;/span&gt;
	&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;k8s.io/client-go/rest&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;

&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;main&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
	&lt;span style=&#34;color:#000&#34;&gt;config&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;rest&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;InClusterConfig&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;
	&lt;span style=&#34;color:#000&#34;&gt;logger&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;runtime&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;NewLoggerWithSource&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;
	&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
		&lt;span style=&#34;color:#000&#34;&gt;logger&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WithError&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;err&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Fatal&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Could not create in cluster config&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;
	&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;

	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Access to standard Kubernetes resources through the Kubernetes Clientset
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// We don&amp;#39;t actually need this for this example, but it&amp;#39;s just here for
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// illustrative purposes
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#000&#34;&gt;kubeClient&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;kubernetes&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;NewForConfig&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;config&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;
	&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
		&lt;span style=&#34;color:#000&#34;&gt;logger&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WithError&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;err&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Fatal&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Could not create the kubernetes clientset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;
	&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;

	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Access to the Agones resources through the Agones Clientset
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Note that we reuse the same config as we used for the Kubernetes Clientset
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#000&#34;&gt;agonesClient&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;versioned&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;NewForConfig&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;config&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;
	&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
		&lt;span style=&#34;color:#000&#34;&gt;logger&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WithError&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;err&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Fatal&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Could not create the agones api clientset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;
	&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;

	&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Create a GameServer
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#000&#34;&gt;gs&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;agonesv1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GameServer&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ObjectMeta&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;metav1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ObjectMeta&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GenerateName&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;udp-server&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Namespace&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
		&lt;span style=&#34;color:#000&#34;&gt;Spec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agonesv1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GameServerSpec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
			&lt;span style=&#34;color:#000&#34;&gt;Container&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;udp-server&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
			&lt;span style=&#34;color:#000&#34;&gt;Ports&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[]&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;agonesv1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GameServerPort&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{{&lt;/span&gt;
				&lt;span style=&#34;color:#000&#34;&gt;ContainerPort&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;7654&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
				&lt;span style=&#34;color:#000&#34;&gt;HostPort&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;      &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;7654&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
				&lt;span style=&#34;color:#000&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;          &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;gameport&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
				&lt;span style=&#34;color:#000&#34;&gt;PortPolicy&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;    &lt;span style=&#34;color:#000&#34;&gt;agonesv1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Static&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
				&lt;span style=&#34;color:#000&#34;&gt;Protocol&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;      &lt;span style=&#34;color:#000&#34;&gt;corev1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ProtocolUDP&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
			&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}},&lt;/span&gt;
			&lt;span style=&#34;color:#000&#34;&gt;Template&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;corev1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;PodTemplateSpec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
				&lt;span style=&#34;color:#000&#34;&gt;Spec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;corev1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;PodSpec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
					&lt;span style=&#34;color:#000&#34;&gt;Containers&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[]&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;corev1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Container&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;udp-server&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Image&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;gcr.io/agones-images/udp-server:0.21&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}},&lt;/span&gt;
				&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
			&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
		&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
	&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
	&lt;span style=&#34;color:#000&#34;&gt;newGS&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;agonesClient&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AgonesV1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;().&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GameServers&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Create&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;gs&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;
	&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
		&lt;span style=&#34;color:#204a87&#34;&gt;panic&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;err&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;
	&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;

	&lt;span style=&#34;color:#000&#34;&gt;fmt&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Printf&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;New game servers&amp;#39; name is: %s&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;newGS&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ObjectMeta&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In order to create GS using provided example, you can run it as a Kubernetes Job:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/crd-client/create-gs.yaml --namespace agones-system
$ kubectl get pods --namespace agones-system
NAME                                 READY   STATUS      RESTARTS   AGE
create-gs-6wz86-7qsm5                &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;/1     Completed   &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          6s
$ kubectl logs create-gs-6wz86-7qsm5  --namespace agones-system
&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;\u0026{0xc0001dde00 default}&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;severity&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;info&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;source&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;time&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;2020-04-21T11:14:00.477576428Z&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;New GameServer name is: helm-test-server-fxfgg&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;severity&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;info&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;time&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;2020-04-21T11:14:00.516024697Z&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You have just created a GameServer using Kubernetes Go Client.&lt;/p&gt;

&lt;h2 id=&#34;direct-access-to-the-rest-api-via-kubectl&#34;&gt;Direct Access to the REST API via Kubectl&lt;/h2&gt;

&lt;p&gt;If there isn&amp;rsquo;t a client written in your preferred language, it is always possible to communicate
directly with Kubernetes API to interact with Agones.&lt;/p&gt;

&lt;p&gt;The Kubernetes API can be authenticated and exposed locally through the
&lt;a href=&#34;https://kubernetes.io/docs/tasks/access-kubernetes-api/http-proxy-access-api/&#34;&gt;&lt;code&gt;kubectl proxy&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl proxy &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;
Starting to serve on &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;127&lt;/span&gt;.0.0.1:8001

&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# list all Agones endpoints&lt;/span&gt;
$ curl http://localhost:8001/apis &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; grep agones -A &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;5&lt;/span&gt; -B &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;5&lt;/span&gt;
...
    &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones.dev&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;versions&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;
        &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
          &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;groupVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones.dev/v1&amp;#34;&lt;/span&gt;,
          &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;v1&amp;#34;&lt;/span&gt;
        &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;
      &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt;,
      &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;preferredVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;groupVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones.dev/v1&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;v1&amp;#34;&lt;/span&gt;
      &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;,
      &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;serverAddressByClientCIDRs&amp;#34;&lt;/span&gt;: null
    &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;
...

&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# List Agones resources&lt;/span&gt;
$ curl http://localhost:8001/apis/agones.dev/v1
&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;kind&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;APIResourceList&amp;#34;&lt;/span&gt;,
  &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;apiVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;v1&amp;#34;&lt;/span&gt;,
  &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;groupVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones.dev/v1&amp;#34;&lt;/span&gt;,
  &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;resources&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;
    &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;gameservers&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;singularName&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;gameserver&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;namespaced&amp;#34;&lt;/span&gt;: true,
      &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;kind&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;GameServer&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;verbs&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;delete&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;deletecollection&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;get&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;list&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;patch&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;create&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;update&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;watch&amp;#34;&lt;/span&gt;
      &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt;,
      &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;shortNames&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;gs&amp;#34;&lt;/span&gt;
      &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt;
    &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;
  &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# list all gameservers in the default namespace&lt;/span&gt;
$ curl http://localhost:8001/apis/agones.dev/v1/namespaces/default/gameservers
&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;apiVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones.dev/v1&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;items&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;
        &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;apiVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones.dev/v1&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;kind&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;GameServer&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;metadata&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;annotations&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
                    &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;kubectl.kubernetes.io/last-applied-configuration&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;{\&amp;#34;apiVersion\&amp;#34;:\&amp;#34;agones.dev/v1\&amp;#34;,\&amp;#34;kind\&amp;#34;:\&amp;#34;GameServer\&amp;#34;,\&amp;#34;metadata\&amp;#34;:{\&amp;#34;annotations\&amp;#34;:{},\&amp;#34;name\&amp;#34;:\&amp;#34;simple-udp\&amp;#34;,\&amp;#34;namespace\&amp;#34;:\&amp;#34;default\&amp;#34;},\&amp;#34;spec\&amp;#34;:{\&amp;#34;containerPort\&amp;#34;:7654,\&amp;#34;hostPort\&amp;#34;:7777,\&amp;#34;portPolicy\&amp;#34;:\&amp;#34;static\&amp;#34;,\&amp;#34;template\&amp;#34;:{\&amp;#34;spec\&amp;#34;:{\&amp;#34;containers\&amp;#34;:[{\&amp;#34;image\&amp;#34;:\&amp;#34;gcr.io/agones-images/udp-server:0.21\&amp;#34;,\&amp;#34;name\&amp;#34;:\&amp;#34;simple-udp\&amp;#34;}]}}}}\n&amp;#34;&lt;/span&gt;
                &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;,
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;clusterName&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;creationTimestamp&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;2018-03-02T21:41:05Z&amp;#34;&lt;/span&gt;,
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;finalizers&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;
                    &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones.dev&amp;#34;&lt;/span&gt;
                &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt;,
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;generation&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;,
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;simple-udp&amp;#34;&lt;/span&gt;,
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;namespace&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;,
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;resourceVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;760&amp;#34;&lt;/span&gt;,
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;selfLink&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;/apis/agones.dev/v1/namespaces/default/gameservers/simple-udp&amp;#34;&lt;/span&gt;,
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;uid&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;692beea6-1e62-11e8-beb2-080027637781&amp;#34;&lt;/span&gt;
            &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;,
            &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;spec&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;PortPolicy&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Static&amp;#34;&lt;/span&gt;,
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;container&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;simple-udp&amp;#34;&lt;/span&gt;,
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;containerPort&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;7654&lt;/span&gt;,
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;health&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
                    &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;failureThreshold&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;3&lt;/span&gt;,
                    &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;initialDelaySeconds&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;5&lt;/span&gt;,
                    &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;periodSeconds&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;5&lt;/span&gt;
                &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;,
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;hostPort&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;7777&lt;/span&gt;,
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;protocol&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;UDP&amp;#34;&lt;/span&gt;,
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
                    &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;metadata&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
                        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;creationTimestamp&amp;#34;&lt;/span&gt;: null
                    &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;,
                    &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;spec&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
                        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;containers&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;
                            &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
                                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;gcr.io/agones-images/udp-server:0.21&amp;#34;&lt;/span&gt;,
                                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;simple-udp&amp;#34;&lt;/span&gt;,
                                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;resources&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{}&lt;/span&gt;
                            &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;
                        &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt;
                    &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;
                &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;
            &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;,
            &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;address&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;192.168.99.100&amp;#34;&lt;/span&gt;,
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;nodeName&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones&amp;#34;&lt;/span&gt;,
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;port&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;7777&lt;/span&gt;,
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;state&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Ready&amp;#34;&lt;/span&gt;
            &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;
        &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt;,
    &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;kind&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;GameServerList&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;metadata&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;continue&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;resourceVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;1062&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;selfLink&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;/apis/agones.dev/v1/namespaces/default/gameservers&amp;#34;&lt;/span&gt;
    &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# allocate a gameserver from a fleet named &amp;#39;simple-udp&amp;#39;, with GameServerAllocation&lt;/span&gt;

$ curl -d &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;{&amp;#34;apiVersion&amp;#34;:&amp;#34;allocation.agones.dev/v1&amp;#34;,&amp;#34;kind&amp;#34;:&amp;#34;GameServerAllocation&amp;#34;,&amp;#34;spec&amp;#34;:{&amp;#34;required&amp;#34;:{&amp;#34;matchLabels&amp;#34;:{&amp;#34;agones.dev/fleet&amp;#34;:&amp;#34;simple-udp&amp;#34;}}}}&amp;#39;&lt;/span&gt; -H &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; -X POST http://localhost:8001/apis/allocation.agones.dev/v1/namespaces/default/gameserverallocations

&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;kind&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;GameServerAllocation&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;apiVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;allocation.agones.dev/v1&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;metadata&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;simple-udp-v6jwb-cmdcv&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;namespace&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;creationTimestamp&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;2019-07-03T17:19:47Z&amp;#34;&lt;/span&gt;
    &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;,
    &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;spec&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;multiClusterSetting&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;policySelector&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{}&lt;/span&gt;
        &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;,
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;required&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;matchLabels&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones.dev/fleet&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;simple-udp&amp;#34;&lt;/span&gt;
            &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;
        &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;,
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;scheduling&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Packed&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;metadata&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{}&lt;/span&gt;
    &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;,
    &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;state&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Allocated&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;gameServerName&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;simple-udp-v6jwb-cmdcv&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;ports&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;[&lt;/span&gt;
            &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{&lt;/span&gt;
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;,
                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;port&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;7445&lt;/span&gt;
            &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;
        &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;]&lt;/span&gt;,
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;address&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;34.94.118.237&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;nodeName&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;gke-test-cluster-default-f11755a7-5km3&amp;#34;&lt;/span&gt;
    &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You may wish to review the &lt;a href=&#34;/site/site/docs/reference/agones_crd_api_reference/&#34;&gt;Agones Kubernetes API&lt;/a&gt; for the full data structure reference.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&#34;https://kubernetes.io/docs/reference/using-api/api-concepts/&#34;&gt;Kubernetes API Concepts&lt;/a&gt;
section may also provide the more details on the API conventions that are used in the Kubernetes API.&lt;/p&gt;

&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Learn how to use &lt;a href=&#34;/site/site/docs/advanced/allocator-service/&#34;&gt;Allocator Service&lt;/a&gt; for single and multi-cluster Allocation.&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Rust Game Server Client SDK</title>
      <link>/site/docs/guides/client-sdks/rust/</link>
      <pubDate>Wed, 02 Jan 2019 10:17:57 +0000</pubDate>
      
      <guid>/site/docs/guides/client-sdks/rust/</guid>
      <description>
        
        
        

&lt;p&gt;Check the &lt;a href=&#34;/site/site/docs/guides/client-sdks/&#34;&gt;Client SDK Documentation&lt;/a&gt; for more details on each of the SDK functions and how to run the SDK locally.&lt;/p&gt;

&lt;h2 id=&#34;download&#34;&gt;Download&lt;/h2&gt;

&lt;p&gt;Download the source 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/sdks/rust&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;directly from GitHub&lt;/a&gt;
.&lt;/p&gt;

&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CMake &amp;gt;= 3.8.0&lt;/li&gt;
&lt;li&gt;Rust &amp;gt;= 1.19.0&lt;/li&gt;
&lt;li&gt;Go (&amp;gt;=1.7)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The SDK needs the above for building to &lt;a href=&#34;https://github.com/pingcap/grpc-rs&#34;&gt;gRPC-rs&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;

&lt;p&gt;Add this crate to &lt;code&gt;dependencies&lt;/code&gt; section in your Cargo.toml.
Specify a directory where this README.md is located to the &lt;code&gt;path&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;dependencies&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a40000&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;path&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;../agones/sdks/rust&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a40000&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Add &lt;code&gt;extern crate agones&lt;/code&gt; to your crate root.&lt;/p&gt;

&lt;p&gt;To begin working with the SDK, create an instance of it. This function blocks until connection and handshake are made.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;let&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;agones&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Sdk&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;new&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;?&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To send a &lt;a href=&#34;/site/site/docs/guides/client-sdks/#health&#34;&gt;health check&lt;/a&gt; ping call &lt;code&gt;sdk.health()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;health&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;().&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;is_ok&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;println&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Health ping sent&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To mark the &lt;a href=&#34;/site/site/docs/guides/client-sdks/#ready&#34;&gt;game session as ready&lt;/a&gt; call &lt;code&gt;sdk.ready()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ready&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;?&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To mark the game server as &lt;a href=&#34;/site/site/docs/guides/client-sdks/#reserve-seconds&#34;&gt;reserved&lt;/a&gt; for a period of time, call &lt;code&gt;sdk.reserve(duration)&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;reserve&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Duration&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;new&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;))&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;?&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To mark that the &lt;a href=&#34;/site/site/docs/guides/client-sdks/#shutdown&#34;&gt;game session is completed&lt;/a&gt; and the game server should be shut down call &lt;code&gt;sdk.shutdown()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;shutdown&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;().&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;is_err&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;println&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Could not run Shutdown&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To &lt;a href=&#34;/site/site/docs/guides/client-sdks/#setlabel-key-value&#34;&gt;set a Label&lt;/a&gt; on the backing &lt;code&gt;GameServer&lt;/code&gt; call &lt;code&gt;sdk.set_label(key, value)&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;set_label&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;test-label&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;test-value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;?&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To &lt;a href=&#34;/site/site/docs/guides/client-sdks/#setannotation-key-value&#34;&gt;set an Annotation&lt;/a&gt; on the backing &lt;code&gt;GameServer&lt;/code&gt; call &lt;code&gt;sdk.set_annotation(key, value)&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;set_annotation&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;test-annotation&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;test value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;?&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To get &lt;a href=&#34;/site/site/docs/guides/client-sdks/#gameserver&#34;&gt;details of the backing &lt;code&gt;GameServer&lt;/code&gt;&lt;/a&gt; call &lt;code&gt;sdk.get_gameserver()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The function will return an instance of &lt;code&gt;agones::types::GameServer&lt;/code&gt; including &lt;code&gt;GameServer&lt;/code&gt; configuration info.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;let&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;gameserver&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;get_gameserver&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;?&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To get &lt;a href=&#34;/site/site/docs/guides/client-sdks/#watchgameserver-function-gameserver&#34;&gt;updates on the backing &lt;code&gt;GameServer&lt;/code&gt;&lt;/a&gt; as they happen, call &lt;code&gt;sdk.watch_gameserver(|gameserver| {...})&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This will call the passed closure synchronously (this is a blocking function, so you may want to run it in its own thread) whenever the backing &lt;code&gt;GameServer&lt;/code&gt; is updated.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;sdk&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;watch_gameserver&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;|&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;gameserver&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;|&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;println&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;GameServer Update, name: {}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;gameserver&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;object_meta&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;unwrap&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;().&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;println&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;GameServer Update, state: {}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;gameserver&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;status&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;unwrap&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;().&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;})&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;?&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For more information, please read the &lt;a href=&#34;/site/site/docs/guides/client-sdks/&#34;&gt;SDK Overview&lt;/a&gt;, check out 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/sdks/rust/src/sdk.rs&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;agones sdk implementation&lt;/a&gt;
 and also look at the 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/rust-simple&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;Rust example&lt;/a&gt;
.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Confirming Agones Installation</title>
      <link>/site/docs/installation/confirm/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/site/docs/installation/confirm/</guid>
      <description>
        
        
        

&lt;p&gt;To confirm Agones is up and running, run the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;kubectl describe --namespace agones-system pods&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It should describe six pods created in the &lt;code&gt;agones-system&lt;/code&gt; namespace, with no error messages or status. All &lt;code&gt;Conditions&lt;/code&gt; sections should look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;All this pods should be in a &lt;code&gt;RUNNING&lt;/code&gt; state:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;kubectl get pods --namespace agones-system

NAME                                 READY   STATUS    RESTARTS   AGE
agones-allocator-5c988b7b8d-cgtbs    &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;/1     Running   &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          8m47s
agones-allocator-5c988b7b8d-hhhr5    &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;/1     Running   &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          8m47s
agones-allocator-5c988b7b8d-pv577    &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;/1     Running   &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          8m47s
agones-controller-7db45966db-56l66   &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;/1     Running   &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          8m44s
agones-ping-84c64f6c9d-bdlzh         &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;/1     Running   &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          8m37s
agones-ping-84c64f6c9d-sjgzz         &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;/1     Running   &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          8m47s&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That&amp;rsquo;s it!&lt;/p&gt;

&lt;p&gt;Now with Agones installed, you can utilise its &lt;a href=&#34;https://kubernetes.io/docs/concepts/api-extension/custom-resources/&#34;&gt;Custom Resource Definitions&lt;/a&gt; to create
 resources of type &lt;code&gt;GameServer&lt;/code&gt;, &lt;code&gt;Fleet&lt;/code&gt; and more!&lt;/p&gt;

&lt;h2 id=&#34;what-s-next&#34;&gt;What&amp;rsquo;s next&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Go through the &lt;a href=&#34;/site/site/docs/getting-started/create-gameserver/&#34;&gt;Create a Game Server Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Upgrading Agones and Kubernetes</title>
      <link>/site/docs/installation/upgrading/</link>
      <pubDate>Fri, 16 Aug 2019 00:19:19 +0000</pubDate>
      
      <guid>/site/docs/installation/upgrading/</guid>
      <description>
        
        
        



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
Whichever approach you take to upgrading Agones, make sure to test it in your development environment
before applying it to production.
&lt;/div&gt;


&lt;h2 id=&#34;upgrading-agones&#34;&gt;Upgrading Agones&lt;/h2&gt;

&lt;p&gt;The following are strategies for safely upgrading Agones from one version to another. They may require adjustment to
your particular game architecture but should provide a solid foundation for updating Agones safely.&lt;/p&gt;

&lt;p&gt;The recommended approach is to use &lt;a href=&#34;#upgrading-agones-multiple-clusters&#34;&gt;multiple clusters&lt;/a&gt;, such that the upgrade can be tested
gradually with production load and easily rolled back if the need arises.&lt;/p&gt;

&lt;h3 id=&#34;upgrading-agones-multiple-clusters&#34;&gt;Upgrading Agones: Multiple Clusters&lt;/h3&gt;

&lt;p&gt;We essentially want to transition our GameServer allocations from a cluster with the old version of Agones,
to a cluster with the upgraded version of Agones while ensuring nothing surprising
happens during this process.&lt;/p&gt;

&lt;p&gt;This also allows easy rollback to the previous infrastructure that we already know to be working in production, with
minimal interruptions to player experience.&lt;/p&gt;

&lt;p&gt;The following are steps to implement this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a new cluster of the same size or smaller as the current cluster.&lt;/li&gt;
&lt;li&gt;Install the new version of Agones on the new cluster.&lt;/li&gt;
&lt;li&gt;Deploy the same set of Fleets and/or GameServers from the old cluster into the new cluster.&lt;/li&gt;
&lt;li&gt;With your matchmaker, start sending a small percentage of your matched players&amp;rsquo; game sessions to the new cluster.&lt;/li&gt;
&lt;li&gt;Assuming everything is working successfully on the new cluster, slowly increase the percentage of matched sessions to the new cluster, until you reach 100%.&lt;/li&gt;
&lt;li&gt;Once you are comfortable with the stability of the new cluster with the new Agones version, shut down the old cluster.&lt;/li&gt;
&lt;li&gt;Congratulations - you have now upgraded to a new version of Agones! 👍&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&#34;upgrading-agones-single-cluster&#34;&gt;Upgrading Agones: Single Cluster&lt;/h3&gt;

&lt;p&gt;If you are upgrading a single cluster, we recommend creating a maintenance window, in which your game goes offline
for the period of your upgrade, as there will be a short period in which Agones will be non-responsive during the upgrade.&lt;/p&gt;

&lt;h4 id=&#34;installation-with-install-yaml&#34;&gt;Installation with install.yaml&lt;/h4&gt;

&lt;p&gt;If you installed &lt;a href=&#34;/site/site/docs/installation/install-agones/yaml/&#34;&gt;Agones with install.yaml&lt;/a&gt;, then you will need to delete
the previous installation of Agones before upgrading to the new version, as we need to remove all of Agones before installing
the new version.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start your maintenance window.&lt;/li&gt;
&lt;li&gt;Delete the current set of Fleets and/or GameServers in your cluster.&lt;/li&gt;
&lt;li&gt;Make sure to delete the same version of Agones that was previously installed, for example:
&lt;code&gt;kubectl delete -f https://raw.githubusercontent.com/googleforgames/agones/&amp;lt;old-release-version&amp;gt;/install/yaml/install.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Install Agones &lt;a href=&#34;/site/site/docs/installation/install-agones/yaml/&#34;&gt;with install.yaml&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Deploy the same set of Fleets and/or GameServers back into the cluster.&lt;/li&gt;
&lt;li&gt;Run any other tests to ensure the Agones installation is working as expected.&lt;/li&gt;
&lt;li&gt;Close your maintenance window.&lt;/li&gt;
&lt;li&gt;Congratulations - you have now upgraded to a new version of Agones! 👍&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&#34;installation-with-helm&#34;&gt;Installation with Helm&lt;/h4&gt;

&lt;p&gt;Helm features capabilities for upgrading to newer versions of Agones without having to delete the older version or your
existing Fleets.&lt;/p&gt;

&lt;p&gt;For details on how to use Helm for upgrades, see the &lt;a href=&#34;https://v2.helm.sh/docs/helm/#helm-upgrade&#34;&gt;helm upgrade&lt;/a&gt; documentation.&lt;/p&gt;

&lt;p&gt;Given the above, the steps for upgrade are simpler:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start your maintenance window.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;helm upgrade&lt;/code&gt; with the appropriate arguments, such a &lt;code&gt;--version&lt;/code&gt;, for your specific upgrade&lt;/li&gt;
&lt;li&gt;Run any other tests to ensure the Agones installation is working as expected.&lt;/li&gt;
&lt;li&gt;Close your maintenance window.&lt;/li&gt;
&lt;li&gt;Congratulations - you have now upgraded to a new version of Agones! 👍&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;upgrading-kubernetes&#34;&gt;Upgrading Kubernetes&lt;/h2&gt;

&lt;p&gt;The following are strategies for safely upgrading the underlying Kubernetes cluster from one version to another.
They may require adjustment to your particular game architecture but should provide a solid foundation for updating your cluster safely.&lt;/p&gt;

&lt;p&gt;The recommended approach is to use &lt;a href=&#34;#multiple-clusters&#34;&gt;multiple clusters&lt;/a&gt;, such that the upgrade can be tested
gradually with production load and easily rolled back if the need arises.&lt;/p&gt;

&lt;p&gt;Agones currently has only a &lt;a href=&#34;/site/site/docs/installation/#usage-requirements&#34;&gt;single supported Kubernetes version&lt;/a&gt; for each version,
so it is recommended to do supported minor (e.g. 1.12.1 ➡ 1.13.2) Kubernetes version upgrades at the same time as a matching Agones upgrades.&lt;/p&gt;

&lt;p&gt;Patch upgrades (e.g. 1.12.1 ➡ 1.12.3) within the same minor version of Kubernetes can be done at any time.&lt;/p&gt;

&lt;h3 id=&#34;multiple-clusters&#34;&gt;Multiple Clusters&lt;/h3&gt;

&lt;p&gt;This process is very similar to the &lt;a href=&#34;#upgrading-agones-multiple-clusters&#34;&gt;Upgrading Agones: Multiple Clusters&lt;/a&gt; approach above.&lt;/p&gt;

&lt;p&gt;We essentially want to transition our GameServer allocations from a cluster with the old version of Kubernetes,
to a cluster with the upgraded version of Kubernetes while ensuring nothing surprising
happens during this process.&lt;/p&gt;

&lt;p&gt;This also allows easy rollback to the previous infrastructure that we already know to be working in production, with
minimal interruptions to player experience.&lt;/p&gt;

&lt;p&gt;The following are steps to implement this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a new cluster of the same size or smaller as the current cluster, with the new version of Kubernetes&lt;/li&gt;
&lt;li&gt;Install the same version of Agones on the new cluster, as you have on the previous cluster.&lt;/li&gt;
&lt;li&gt;Deploy the same set of Fleets and/or GameServers from the old cluster into the new cluster.&lt;/li&gt;
&lt;li&gt;With your matchmaker, start sending a small percentage of your matched players&amp;rsquo; game sessions to the new cluster.&lt;/li&gt;
&lt;li&gt;Assuming everything is working successfully on the new cluster, slowly increase the percentage of matched sessions to the new cluster, until you reach 100%.&lt;/li&gt;
&lt;li&gt;Once you are comfortable with the stability of the new cluster with the new Kubernetes version, shut down the old cluster.&lt;/li&gt;
&lt;li&gt;Congratulations - you have now upgraded to a new version of Kubernetes! 👍&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&#34;single-cluster&#34;&gt;Single Cluster&lt;/h3&gt;

&lt;p&gt;If you are upgrading a single cluster, we recommend creating a maintenance window, in which your game goes offline
for the period of your upgrade, as there will be a short period in which Agones will be non-responsive during the node
upgrades.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start your maintenance window.&lt;/li&gt;
&lt;li&gt;Scale your Fleets down to 0 and/or delete your GameServers. This is a good safety measure so there aren&amp;rsquo;t race conditions
between the Agones controller being recreated and GameServers being deleted doesn&amp;rsquo;t occur, and GameServers can end up stuck in erroneous states.&lt;/li&gt;
&lt;li&gt;Start and complete you master upgrade(s).&lt;/li&gt;
&lt;li&gt;Start and complete your node upgrades.&lt;/li&gt;
&lt;li&gt;Scale your Fleets back up and/or recreate your GameServers.&lt;/li&gt;
&lt;li&gt;Run any other tests to ensure the Agones installation is still working as expected.&lt;/li&gt;
&lt;li&gt;Close your maintenance window.&lt;/li&gt;
&lt;li&gt;Congratulations - you have now upgraded to a new version of Kubernetes! 👍&lt;/li&gt;
&lt;/ol&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: REST Game Server Client API</title>
      <link>/site/docs/guides/client-sdks/rest/</link>
      <pubDate>Wed, 02 Jan 2019 10:18:08 +0000</pubDate>
      
      <guid>/site/docs/guides/client-sdks/rest/</guid>
      <description>
        
        
        

&lt;p&gt;Check the &lt;a href=&#34;/site/site/docs/guides/client-sdks/&#34;&gt;Client SDK Documentation&lt;/a&gt; for more details on each of the SDK functions and how to run the SDK locally.&lt;/p&gt;

&lt;p&gt;The REST API can be accessed from &lt;code&gt;http://localhost:${AGONES_SDK_HTTP_PORT}/&lt;/code&gt; from the game server process.
&lt;code&gt;AGONES_SDK_HTTP_PORT&lt;/code&gt; is an environment variable automatically set for the game server process by Agones to
support binding the REST API to a dynamic port. It is advised to use the environment variable rather than a
hard coded port; otherwise your game server will not be able to contact the SDK server if it is configured to
use a non-default port.&lt;/p&gt;

&lt;p&gt;Generally the REST interface gets used if gRPC isn&amp;rsquo;t well supported for a given language or platform.&lt;/p&gt;



&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Warning&lt;/h4&gt;
The SDK Server sidecar process may startup after your game server binary. So your REST SDK API calls should
contain some retry logic to take this into account.
&lt;/div&gt;


&lt;h2 id=&#34;generating-clients&#34;&gt;Generating clients&lt;/h2&gt;

&lt;p&gt;While you can hand write REST integrations, we also have a set
of 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/sdks/swagger&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;generated OpenAPI/Swagger definitions&lt;/a&gt;
 available.
This means you can use OpenAPI/Swagger tooling to generate clients as well, if you need them.&lt;/p&gt;

&lt;p&gt;For example, to create a cpp client for the stable sdk endpoints (to be run in the &lt;code&gt;agones&lt;/code&gt; home directory):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;docker run --rm -v &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;PWD&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;:/local swaggerapi/swagger-codegen-cli generate -i /local/sdks/swagger/sdk.swagger.json  -l cpprest -o /local/out/cpp&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The same could be run for &lt;code&gt;alpha.swagger.json&lt;/code&gt; and &lt;code&gt;beta.swagger.json&lt;/code&gt; as required.&lt;/p&gt;

&lt;p&gt;You can read more about OpenAPI/Swagger code generation in their &lt;a href=&#34;https://swagger.io/docs/open-source-tools/swagger-codegen/&#34;&gt;Command Line Tool Documentation&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&#34;reference&#34;&gt;Reference&lt;/h2&gt;

&lt;h3 id=&#34;lifecycle-management&#34;&gt;Lifecycle Management&lt;/h3&gt;

&lt;h4 id=&#34;ready&#34;&gt;Ready&lt;/h4&gt;

&lt;p&gt;Call when the GameServer is ready to accept connections&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Path: &lt;code&gt;/ready&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Method: &lt;code&gt;POST&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Body: &lt;code&gt;{}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&#34;example&#34;&gt;Example&lt;/h5&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ curl -d &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;{}&amp;#34;&lt;/span&gt; -H &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; -X POST http://localhost:&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AGONES_SDK_HTTP_PORT&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/ready&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;health&#34;&gt;Health&lt;/h4&gt;

&lt;p&gt;Send a Empty every d Duration to declare that this GameServer is healthy&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Path: &lt;code&gt;/health&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Method: &lt;code&gt;POST&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Body: &lt;code&gt;{}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&#34;example-1&#34;&gt;Example&lt;/h5&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ curl -d &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;{}&amp;#34;&lt;/span&gt; -H &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; -X POST http://localhost:&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AGONES_SDK_HTTP_PORT&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/health&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;reserve&#34;&gt;Reserve&lt;/h4&gt;

&lt;p&gt;Move Gameserver into a Reserved state for a certain amount of seconds for the future allocation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Path: &lt;code&gt;/reserve&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Method: &lt;code&gt;POST&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Body: &lt;code&gt;{&amp;quot;seconds&amp;quot;: &amp;quot;5&amp;quot;}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&#34;example-2&#34;&gt;Example&lt;/h5&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ curl -d &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;{&amp;#34;seconds&amp;#34;: &amp;#34;5&amp;#34;}&amp;#39;&lt;/span&gt; -H &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; -X POST http://localhost:&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AGONES_SDK_HTTP_PORT&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/reserve&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;allocate&#34;&gt;Allocate&lt;/h4&gt;

&lt;p&gt;With some matchmakers and game matching strategies, it can be important for game servers to mark themselves as &lt;code&gt;Allocated&lt;/code&gt;.
For those scenarios, this SDK functionality exists.&lt;/p&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
Using a &lt;a href=&#34;/site/site/docs/reference/gameserverallocation/&#34;&gt;GameServerAllocation&lt;/a&gt; is preferred in all other scenarios,
as it gives Agones control over how packed &lt;code&gt;GameServers&lt;/code&gt; are scheduled within a cluster, whereas with &lt;code&gt;Allocate()&lt;/code&gt; you
relinquish control to an external service which likely doesn&amp;rsquo;t have as much information as Agones.
&lt;/div&gt;


&lt;h5 id=&#34;example-3&#34;&gt;Example&lt;/h5&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ curl -d &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;{}&amp;#34;&lt;/span&gt; -H &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; -X POST http://localhost:&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AGONES_SDK_HTTP_PORT&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/allocate&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;shutdown&#34;&gt;Shutdown&lt;/h4&gt;

&lt;p&gt;Call when the GameServer session is over and it&amp;rsquo;s time to shut down&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Path: &lt;code&gt;/shutdown&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Method: &lt;code&gt;POST&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Body: &lt;code&gt;{}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&#34;example-4&#34;&gt;Example&lt;/h5&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ curl -d &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;{}&amp;#34;&lt;/span&gt; -H &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; -X POST http://localhost:&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AGONES_SDK_HTTP_PORT&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/shutdown&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;configuration-retrieval&#34;&gt;Configuration Retrieval&lt;/h3&gt;

&lt;h4 id=&#34;gameserver&#34;&gt;GameServer&lt;/h4&gt;

&lt;p&gt;Call when you want to retrieve the backing &lt;code&gt;GameServer&lt;/code&gt; configuration details&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Path: &lt;code&gt;/gameserver&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Method: &lt;code&gt;GET&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ curl -H &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; -X GET http://localhost:&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AGONES_SDK_HTTP_PORT&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/gameserver&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Response:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;object_meta&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;local&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;namespace&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;uid&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;1234&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;resource_version&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;v1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;generation&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;creation_timestamp&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;1531795395&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;annotations&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;annotation&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;
        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;labels&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;islocal&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;
        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;state&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Ready&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;address&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;ports&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;
            &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
                &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
                &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;port&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;7777&lt;/span&gt;
            &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;watch-gameserver&#34;&gt;Watch GameServer&lt;/h4&gt;

&lt;p&gt;Call this when you want to get updates of when the backing &lt;code&gt;GameServer&lt;/code&gt; configuration is updated.&lt;/p&gt;

&lt;p&gt;These updates will come as newline delimited JSON, send on each update. To that end, you will
want to keep the http connection open, and read lines from the result stream and and process as they
come in.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ curl -H &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; -X GET http://localhost:&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AGONES_SDK_HTTP_PORT&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/watch/gameserver&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;object_meta&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;local&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;namespace&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;uid&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;1234&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;resource_version&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;v1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;generation&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;creation_timestamp&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;1533766607&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;annotations&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;annotation&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;labels&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;islocal&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}},&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;state&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Ready&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;address&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;ports&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:[{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;port&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;7777&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}]}}}&lt;/span&gt;
&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;object_meta&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;local&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;namespace&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;uid&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;1234&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;resource_version&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;v1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;generation&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;creation_timestamp&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;1533766607&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;annotations&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;annotation&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;labels&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;islocal&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}},&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;state&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Ready&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;address&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;ports&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:[{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;port&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;7777&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}]}}}&lt;/span&gt;
&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;object_meta&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;local&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;namespace&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;uid&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;1234&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;resource_version&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;v1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;generation&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;creation_timestamp&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;1533766607&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;annotations&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;annotation&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;labels&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;islocal&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}},&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;state&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Ready&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;address&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;ports&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:[{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;port&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;7777&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}]}}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;metadata-management&#34;&gt;Metadata Management&lt;/h3&gt;

&lt;h4 id=&#34;set-label&#34;&gt;Set Label&lt;/h4&gt;

&lt;p&gt;Apply a Label with the prefix &amp;ldquo;agones.dev/sdk-&amp;rdquo; to the backing &lt;code&gt;GameServer&lt;/code&gt; metadata.&lt;/p&gt;

&lt;p&gt;See the SDK &lt;a href=&#34;/site/site/docs/guides/client-sdks/#setlabel-key-value&#34;&gt;SetLabel&lt;/a&gt; documentation for restrictions.&lt;/p&gt;

&lt;h5 id=&#34;example-5&#34;&gt;Example&lt;/h5&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ curl -d &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;{&amp;#34;key&amp;#34;: &amp;#34;foo&amp;#34;, &amp;#34;value&amp;#34;: &amp;#34;bar&amp;#34;}&amp;#39;&lt;/span&gt; -H &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; -X PUT http://localhost:&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AGONES_SDK_HTTP_PORT&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/metadata/label&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;set-annotation&#34;&gt;Set Annotation&lt;/h4&gt;

&lt;p&gt;Apply an Annotation with the prefix &amp;ldquo;agones.dev/sdk-&amp;rdquo; to the backing &lt;code&gt;GameServer&lt;/code&gt; metadata&lt;/p&gt;

&lt;h5 id=&#34;example-6&#34;&gt;Example&lt;/h5&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ curl -d &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;{&amp;#34;key&amp;#34;: &amp;#34;foo&amp;#34;, &amp;#34;value&amp;#34;: &amp;#34;bar&amp;#34;}&amp;#39;&lt;/span&gt; -H &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; -X PUT http://localhost:&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AGONES_SDK_HTTP_PORT&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/metadata/annotation&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;player-tracking&#34;&gt;Player Tracking&lt;/h3&gt;


&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
    &lt;h4 class=&#34;alert-heading&#34;&gt;Warning&lt;/h4&gt;
    &lt;p&gt;The Player Tracking feature is currently &lt;strong&gt;&lt;a href=&#34;/site/site/docs/guides/feature-stages/#alpha&#34;&gt;Alpha&lt;/a&gt;&lt;/strong&gt;,
        not enabled by default, and may change in the future.&lt;/p&gt;
    &lt;p&gt;Use the Feature Gate &lt;code&gt;PlayerTracking&lt;/code&gt; to enable and test this feature.&lt;/p&gt;
    &lt;p&gt;See the &lt;a href=&#34;/site/site/docs/guides/feature-stages/#feature-gates&#34;&gt;Feature Gate documentation&lt;/a&gt; for details on how to enable features.&lt;/p&gt;
&lt;/div&gt;


&lt;h4 id=&#34;alpha-playerconnect&#34;&gt;Alpha: PlayerConnect&lt;/h4&gt;

&lt;p&gt;This function increases the SDK’s stored player count by one, and appends this playerID to
&lt;code&gt;GameServer.Status.Players.IDs&lt;/code&gt;.&lt;/p&gt;

&lt;h5 id=&#34;example-7&#34;&gt;Example&lt;/h5&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ curl -d &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;{&amp;#34;playerID&amp;#34;: &amp;#34;uzh7i&amp;#34;}&amp;#39;&lt;/span&gt; -H &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; -X POST http://localhost:&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AGONES_SDK_HTTP_PORT&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/alpha/player/connect&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;bool&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;alpha-playerdisconnect&#34;&gt;Alpha: PlayerDisconnect&lt;/h4&gt;

&lt;p&gt;This function decreases the SDK’s stored player count by one, and removes the playerID from
&lt;a href=&#34;/site/site/docs/reference/agones_crd_api_reference/#agones.dev/v1.PlayerStatus&#34;&gt;&lt;code&gt;GameServer.Status.Players.IDs&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h5 id=&#34;example-8&#34;&gt;Example&lt;/h5&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ curl -d &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;{&amp;#34;playerID&amp;#34;: &amp;#34;uzh7i&amp;#34;}&amp;#39;&lt;/span&gt; -H &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; -X POST http://localhost:&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AGONES_SDK_HTTP_PORT&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/alpha/player/disconnect&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;bool&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;alpha-setplayercapacity&#34;&gt;Alpha: SetPlayerCapacity&lt;/h4&gt;

&lt;p&gt;Update the &lt;a href=&#34;/site/site/docs/reference/agones_crd_api_reference/#agones.dev/v1.PlayerStatus&#34;&gt;&lt;code&gt;GameServer.Status.Players.Capacity&lt;/code&gt;&lt;/a&gt; value with a new capacity.&lt;/p&gt;

&lt;h5 id=&#34;example-9&#34;&gt;Example&lt;/h5&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ curl -d &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;{&amp;#34;count&amp;#34;: 5}&amp;#39;&lt;/span&gt; -H &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; -X PUT http://localhost:&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AGONES_SDK_HTTP_PORT&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/alpha/player/capacity&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;alpha-getplayercapacity&#34;&gt;Alpha: GetPlayerCapacity&lt;/h4&gt;

&lt;p&gt;This function retrieves the current player capacity. This is always accurate from what has been set through this SDK,
even if the value has yet to be updated on the GameServer status resource.&lt;/p&gt;

&lt;h5 id=&#34;example-10&#34;&gt;Example&lt;/h5&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ curl -d &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;{}&amp;#39;&lt;/span&gt; -H &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; -X GET http://localhost:&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AGONES_SDK_HTTP_PORT&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/alpha/player/capacity&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;5&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;alpha-getplayercount&#34;&gt;Alpha: GetPlayerCount&lt;/h4&gt;

&lt;p&gt;This function returns if the playerID is currently connected to the GameServer.
This is always accurate from what has been set through this SDK,
even if the value has yet to be updated on the GameServer status resource.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ curl -H &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; -X GET http://localhost:&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AGONES_SDK_HTTP_PORT&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/alpha/player/count&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;2&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h5 id=&#34;example-11&#34;&gt;Example&lt;/h5&gt;

&lt;h4 id=&#34;alpha-isplayerconnected&#34;&gt;Alpha: IsPlayerConnected&lt;/h4&gt;

&lt;p&gt;This function returns if the playerID is currently connected to the GameServer. This is always accurate from what has
been set through this SDK,
even if the value has yet to be updated on the GameServer status resource.&lt;/p&gt;

&lt;h5 id=&#34;example-12&#34;&gt;Example&lt;/h5&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ curl -H &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; -X GET http://localhost:&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AGONES_SDK_HTTP_PORT&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/alpha/player/connected/uzh7i&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;bool&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;alpha-getconnectedplayers&#34;&gt;Alpha: GetConnectedPlayers&lt;/h4&gt;

&lt;p&gt;This function returns the list of the currently connected player ids. This is always accurate from what has been set
through this SDK, even if the value has yet to be updated on the GameServer status resource.&lt;/p&gt;

&lt;h5 id=&#34;example-13&#34;&gt;Example&lt;/h5&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ curl -H &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; -X GET http://localhost:&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AGONES_SDK_HTTP_PORT&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/alpha/player/connected&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;list&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:[&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;uzh7i&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;3zh7i&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
      </description>
    </item>
    
    <item>
      <title>Docs: Minikube</title>
      <link>/site/docs/installation/creating-cluster/minikube/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/site/docs/installation/creating-cluster/minikube/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;installing-minikube&#34;&gt;Installing Minikube&lt;/h2&gt;

&lt;p&gt;First, &lt;a href=&#34;https://minikube.sigs.k8s.io/docs/start/&#34;&gt;install Minikube&lt;/a&gt;, which may also require you to install
a virtualisation solution, such as &lt;a href=&#34;https://www.virtualbox.org&#34;&gt;VirtualBox&lt;/a&gt; as well.&lt;/p&gt;

&lt;h2 id=&#34;creating-an-agones-profile&#34;&gt;Creating an &lt;code&gt;agones&lt;/code&gt; profile&lt;/h2&gt;

&lt;p&gt;Let&amp;rsquo;s use a minikube profile for &lt;code&gt;agones&lt;/code&gt;, to make sure we don&amp;rsquo;t overlap any
existing Minikube clusters you may be running.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;minikube profile agones&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;starting-minikube&#34;&gt;Starting Minikube&lt;/h2&gt;

&lt;p&gt;The following command starts a local minikube cluster via virtualbox - but this can be
replaced by a &lt;a href=&#34;https://github.com/kubernetes/minikube#requirements&#34;&gt;vm-driver&lt;/a&gt; of your choice.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;minikube start --kubernetes-version v1.15.10 --vm-driver virtualbox&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Continue to &lt;a href=&#34;/site/site/docs/installation/install-agones/&#34;&gt;Install Agones&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Troubleshooting</title>
      <link>/site/docs/guides/troubleshooting/</link>
      <pubDate>Thu, 03 Jan 2019 01:20:49 +0000</pubDate>
      
      <guid>/site/docs/guides/troubleshooting/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;something-went-wrong-with-my-gameserver&#34;&gt;Something went wrong with my GameServer&lt;/h2&gt;

&lt;p&gt;If there is something going wrong with your GameServer, there are a few approaches to determining the cause:&lt;/p&gt;

&lt;p&gt;Depending on what is happening, you may want to run &lt;code&gt;kubectl describe &amp;lt;gameserver name&amp;gt;&lt;/code&gt; to view the events
that are associated with that particular &lt;code&gt;GameServer&lt;/code&gt; resource. This can give you insight into the lifecycle of the
&lt;code&gt;GameServer&lt;/code&gt; and if anything has gone wrong.&lt;/p&gt;

&lt;p&gt;For example, here we can see where the simple-udp example has been moved to the &lt;code&gt;Unhealthy&lt;/code&gt; state
due to a crash in the backing &lt;code&gt;GameServer&lt;/code&gt; Pod container&amp;rsquo;s binary.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;root@6a71afd42291:/go/src/agones.dev/agones# kubectl describe gs simple-udp-zqppv
Name:         simple-udp-zqppv
Namespace:    default
Labels:       &amp;lt;none&amp;gt;
Annotations:  agones.dev/sdk-version: 1.0.0-dce1546
API Version:  agones.dev/v1
Kind:         GameServer
Metadata:
  Creation Timestamp:  2019-08-16T21:25:44Z
  Finalizers:
    agones.dev
  Generate Name:     simple-udp-
  Generation:        1
  Resource Version:  1378575
  Self Link:         /apis/agones.dev/v1/namespaces/default/gameservers/simple-udp-zqppv
  UID:               6818adc7-c06c-11e9-8dbd-42010a8a0109
Spec:
  Container:  simple-udp
  Health:
    Failure Threshold:      3
    Initial Delay Seconds:  5
    Period Seconds:         5
  Ports:
    Container Port:  7654
    Host Port:       7058
    Name:            default
    Port Policy:     Dynamic
    Protocol:        UDP
  Scheduling:        Packed
  Template:
    Metadata:
      Creation Timestamp:  &amp;lt;nil&amp;gt;
    Spec:
      Containers:
        Image:  gcr.io/agones-images/udp-server:0.21
        Name:   simple-udp
        Resources:
          Limits:
            Cpu:     20m
            Memory:  32Mi
          Requests:
            Cpu:     20m
            Memory:  32Mi
Status:
  Address:    35.230.59.117
  Node Name:  gke-test-cluster-default-590db5e4-4s6r
  Ports:
    Name:          default
    Port:          7058
  Reserved Until:  &amp;lt;nil&amp;gt;
  State:           Unhealthy
Events:
  Type     Reason          Age   From                   Message
  ----     ------          ----  ----                   -------
  Normal   PortAllocation  72s   gameserver-controller  Port allocated
  Normal   Creating        72s   gameserver-controller  Pod simple-udp-zqppv created
  Normal   Scheduled       72s   gameserver-controller  Address and port populated
  Normal   RequestReady    67s   gameserver-sidecar     SDK state change
  Normal   Ready           66s   gameserver-controller  SDK.Ready() complete
  Warning  Unhealthy       34s   health-controller      Issue with Gameserver pod
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The backing Pod has the same name as the &lt;code&gt;GameServer&lt;/code&gt; - so it&amp;rsquo;s also worth looking at the
details and events for the Pod to see if there are any issues there, such as restarts due to binary crashes etc.&lt;/p&gt;

&lt;p&gt;For example, you can see the restart count on the gcr.io/agones-images/udp-server:0.21 container
is set to &lt;code&gt;1&lt;/code&gt;, due to the game server binary crash&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;root@6a71afd42291:/go/src/agones.dev/agones# kubectl describe pod simple-udp-zqppv
Name:               simple-udp-zqppv
Namespace:          default
Priority:           0
PriorityClassName:  &amp;lt;none&amp;gt;
Node:               gke-test-cluster-default-590db5e4-4s6r/10.138.0.23
Start Time:         Fri, 16 Aug 2019 21:25:44 +0000
Labels:             agones.dev/gameserver=simple-udp-zqppv
                    agones.dev/role=gameserver
Annotations:        agones.dev/container: simple-udp
                    agones.dev/sdk-version: 1.0.0-dce1546
                    cluster-autoscaler.kubernetes.io/safe-to-evict: false
Status:             Running
IP:                 10.48.1.80
Controlled By:      GameServer/simple-udp-zqppv
Containers:
  simple-udp:
    Container ID:   docker://69eacd03cc89b0636b78abe47926b02183ba84d18fa20649ca443f5232511661
    Image:          gcr.io/agones-images/udp-server:0.21
    Image ID:       docker-pullable://gcr.io/agones-images/udp-server@sha256:6a60eff5e68b88b5ce75ae98082d79cff36cda411a090f3495760e5c3b6c3575
    Port:           7654/UDP
    Host Port:      7058/UDP
    State:          Running
      Started:      Fri, 16 Aug 2019 21:26:22 +0000
    Last State:     Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Fri, 16 Aug 2019 21:25:45 +0000
      Finished:     Fri, 16 Aug 2019 21:26:22 +0000
    Ready:          True
    Restart Count:  1
    Limits:
      cpu:     20m
      memory:  32Mi
    Requests:
      cpu:        20m
      memory:     32Mi
    Liveness:     http-get http://:8080/gshealthz delay=5s timeout=1s period=5s #success=1 #failure=3
    Environment:  &amp;lt;none&amp;gt;
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from empty (ro)
  agones-gameserver-sidecar:
    Container ID:   docker://f3c475c34d26232e19b60be65b03bc6ce41931f4c37e00770d3ab4a36281d31c
    Image:          gcr.io/agones-mark/agones-sdk:1.0.0-dce1546
    Image ID:       docker-pullable://gcr.io/agones-mark/agones-sdk@sha256:4b5693e95ee3023a2b2e2099d102bb6bac58d4ce0ac472e58a09cee6d160cd19
    Port:           &amp;lt;none&amp;gt;
    Host Port:      &amp;lt;none&amp;gt;
    State:          Running
      Started:      Fri, 16 Aug 2019 21:25:48 +0000
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:     30m
    Liveness:  http-get http://:8080/healthz delay=3s timeout=1s period=3s #success=1 #failure=3
    Environment:
      GAMESERVER_NAME:  simple-udp-zqppv
      POD_NAMESPACE:    default (v1:metadata.namespace)
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from agones-sdk-token-vr6qq (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  empty:
    Type:    EmptyDir (a temporary directory that shares a pod&#39;s lifetime)
    Medium:
  agones-sdk-token-vr6qq:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  agones-sdk-token-vr6qq
    Optional:    false
QoS Class:       Burstable
Node-Selectors:  &amp;lt;none&amp;gt;
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age                   From                                             Message
  ----    ------     ----                  ----                                             -------
  Normal  Scheduled  2m32s                 default-scheduler                                Successfully assigned default/simple-udp-zqppv to gke-test-cluster-default-590db5e4-4s6r
  Normal  Pulling    2m31s                 kubelet, gke-test-cluster-default-590db5e4-4s6r  pulling image &amp;quot;gcr.io/agones-mark/agones-sdk:1.0.0-dce1546&amp;quot;
  Normal  Started    2m28s                 kubelet, gke-test-cluster-default-590db5e4-4s6r  Started container
  Normal  Pulled     2m28s                 kubelet, gke-test-cluster-default-590db5e4-4s6r  Successfully pulled image &amp;quot;gcr.io/agones-mark/agones-sdk:1.0.0-dce1546&amp;quot;
  Normal  Created    2m28s                 kubelet, gke-test-cluster-default-590db5e4-4s6r  Created container
  Normal  Created    114s (x2 over 2m31s)  kubelet, gke-test-cluster-default-590db5e4-4s6r  Created container
  Normal  Started    114s (x2 over 2m31s)  kubelet, gke-test-cluster-default-590db5e4-4s6r  Started container
  Normal  Pulled     114s (x2 over 2m31s)  kubelet, gke-test-cluster-default-590db5e4-4s6r  Container image &amp;quot;gcr.io/agones-images/udp-server:0.21&amp;quot; already present on machine
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Finally, you can also get the logs of your &lt;code&gt;GameServer&lt;/code&gt; &lt;code&gt;Pod&lt;/code&gt; as well via &lt;code&gt;kubectl logs &amp;lt;pod name&amp;gt; -c &amp;lt;game server container name&amp;gt;&lt;/code&gt;, for example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;root@6a71afd42291:/go/src/agones.dev/agones# kubectl logs simple-udp-zqppv -c simple-udp
2019/08/16 21:26:23 Creating SDK instance
2019/08/16 21:26:24 Starting Health Ping
2019/08/16 21:26:24 Starting UDP server, listening on port 7654
2019/08/16 21:26:24 Marking this server as ready
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The above commands will only give the most recent container&amp;rsquo;s logs (so we won&amp;rsquo;t get the previous crash), but
you can use &lt;code&gt;kubectl logs --previous=true simple-udp-zqppv -c simple-udp&lt;/code&gt; to get the previous instance of the containers logs, or
use your Kubernetes platform of choice&amp;rsquo;s logging aggregation tools to view the crash details.&lt;/p&gt;

&lt;p&gt;For more tips and tricks, the &lt;a href=&#34;https://kubernetes.io/docs/reference/kubectl/cheatsheet/#interacting-with-running-pods&#34;&gt;Kubernetes Cheatsheet: Interactive with Pods&lt;/a&gt;
 also provides more troubleshooting techniques.&lt;/p&gt;

&lt;h2 id=&#34;how-do-i-see-the-logs-for-agones&#34;&gt;How do I see the logs for Agones?&lt;/h2&gt;

&lt;p&gt;If something is going wrong, and you want to see the logs for Agones, there are potentially two places you will want to
check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The controller: assuming you installed Agones in the &lt;code&gt;agones-system&lt;/code&gt; namespace, you will find that there
is a single pod called &lt;code&gt;agones-controller-&amp;lt;hash&amp;gt;&lt;/code&gt; (where hash is the unique code that Kubernetes generates)
that exists there, that you can get the logs from. This is the main
controller for Agones, and should be the first place to check when things go wrong.&lt;br /&gt;

&lt;ol&gt;
&lt;li&gt;To get the logs from this controller run:&lt;br /&gt;
&lt;code&gt;kubectl logs --namespace=agones-system agones-controller-&amp;lt;hash&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;The SDK server sidecar: Agones runs a small &lt;a href=&#34;https://grpc.io/&#34;&gt;gRPC&lt;/a&gt; + http server for the SDK in a container in the
same network namespace as the game server container to connect to via the SDK.&lt;br /&gt;
The logs from this SDK server are also useful for tracking down issues, especially if you are having trouble with a
particular &lt;code&gt;GameServer&lt;/code&gt;.&lt;br /&gt;

&lt;ol&gt;
&lt;li&gt;To find the &lt;code&gt;Pod&lt;/code&gt; for the &lt;code&gt;GameServer&lt;/code&gt; look for the pod with a name that is prefixed with the name of the
owning &lt;code&gt;GameServer&lt;/code&gt;. For example if you have a &lt;code&gt;GameServer&lt;/code&gt; named &lt;code&gt;simple-udp&lt;/code&gt;, it&amp;rsquo;s pod could potentially be named
&lt;code&gt;simple-udp-dnbwj&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;To get the logs from that &lt;code&gt;Pod&lt;/code&gt;, we need to specify that we want the logs from the &lt;code&gt;agones-gameserver-sidecar&lt;/code&gt;
container. To do that, run the following:&lt;br /&gt;
&lt;code&gt;kubectl logs simple-udp-dnbwj -c agones-gameserver-sidecar&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Agones uses JSON structured logging, therefore errors will be visible through the &lt;code&gt;&amp;quot;severity&amp;quot;:&amp;quot;info&amp;quot;&lt;/code&gt; key and value.&lt;/p&gt;

&lt;h2 id=&#34;i-uninstalled-agones-before-deleted-all-my-gameservers-and-now-they-won-t-delete&#34;&gt;I uninstalled Agones before deleted all my &lt;code&gt;GameServers&lt;/code&gt; and now they won&amp;rsquo;t delete&lt;/h2&gt;

&lt;p&gt;Agones &lt;code&gt;GameServers&lt;/code&gt; use &lt;a href=&#34;https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#finalizers&#34;&gt;Finalizers&lt;/a&gt;
to manage garbage collection of the &lt;code&gt;GameServers&lt;/code&gt;. This means that if the Agones controller
doesn&amp;rsquo;t remove the finalizer for you (i.e. if it has been uninstalled),  it can be tricky to remove them all.&lt;/p&gt;

&lt;p&gt;Thankfully, if we create a patch to remove the finalizers from all GameServers, we can delete them with impunity.&lt;/p&gt;

&lt;p&gt;A quick one liner to do this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl get gameserver -o name | xargs -n1 -P1 -I{} kubectl patch {} --type=merge -p &#39;{&amp;quot;metadata&amp;quot;: {&amp;quot;finalizers&amp;quot;: []}}&#39;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Once this is done, you can &lt;code&gt;kubectl delete gs --all&lt;/code&gt; and clean everything up (if it&amp;rsquo;s not gone already).&lt;/p&gt;

&lt;h2 id=&#34;i-m-getting-forbidden-errors-when-trying-to-install-agones&#34;&gt;I&amp;rsquo;m getting Forbidden errors when trying to install Agones&lt;/h2&gt;

&lt;p&gt;Ensure that you are running Kubernetes 1.12 or later, which does not require any special
clusterrolebindings to install Agones.&lt;/p&gt;

&lt;p&gt;If you want to install Agones on an older version of Kubernetes, you need to create a
clusterrolebinding to add your identity as a cluster admin, e.g.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Kubernetes Engine&lt;/span&gt;
kubectl create clusterrolebinding cluster-admin-binding &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --clusterrole cluster-admin --user &lt;span style=&#34;color:#4e9a06&#34;&gt;`&lt;/span&gt;gcloud config get-value account&lt;span style=&#34;color:#4e9a06&#34;&gt;`&lt;/span&gt;
&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Minikube&lt;/span&gt;
kubectl create clusterrolebinding cluster-admin-binding &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  --clusterrole&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;cluster-admin --serviceaccount&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;kube-system:default&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On GKE, &lt;code&gt;gcloud config get-value accounts&lt;/code&gt; will return a lowercase email address, so if
you are using a CamelCase email, you may need to type it in manually.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Local Development</title>
      <link>/site/docs/guides/client-sdks/local/</link>
      <pubDate>Tue, 29 Jan 2019 10:18:08 +0000</pubDate>
      
      <guid>/site/docs/guides/client-sdks/local/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;local-development&#34;&gt;Local Development&lt;/h2&gt;

&lt;p&gt;When the game server is running on Agones, the SDK communicates over TCP to a small
gRPC server that Agones coordinated to run in a container in the same network
namespace as it - usually referred to in Kubernetes terms as a &amp;ldquo;sidecar&amp;rdquo;.&lt;/p&gt;

&lt;p&gt;Therefore, when developing locally, we also need a process for the SDK to connect to!&lt;/p&gt;

&lt;p&gt;To do this, we can run the same binary that runs inside Agones, but pass in a flag
to run it in &amp;ldquo;local mode&amp;rdquo;. Local mode means that the sidecar binary
will not try to connect to anything, and will just send log messages to stdout and persist local state in memory so
that you can see exactly what the SDK in your game server is doing, and can
confirm everything works.&lt;/p&gt;

&lt;p&gt;To do this you will need to download
&lt;a href=&#34;https://github.com/googleforgames/agones/releases/download/v1.7.0/agonessdk-server-1.7.0.zip&#34;  data-proofer-ignore&gt;agonessdk-server-1.7.0.zip&lt;/a&gt;
, and unzip it.
You will find the executables for the SDK server, one for each type of operating system.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sdk-server.windows.amd64.exe&lt;/code&gt; - Windows&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sdk-server.darwin.amd64&lt;/code&gt; - macOS&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sdk-server.linux.amd64&lt;/code&gt; - Linux&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To run in local mode, pass the flag &lt;code&gt;--local&lt;/code&gt; to the executable.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;$ ./sdk-server.linux.amd64 --local
{&amp;#34;ctlConf&amp;#34;:{&amp;#34;Address&amp;#34;:&amp;#34;localhost&amp;#34;,&amp;#34;IsLocal&amp;#34;:true,&amp;#34;LocalFile&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;Delay&amp;#34;:0,&amp;#34;Timeout&amp;#34;:0,&amp;#34;Test&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;GRPCPort&amp;#34;:9357,&amp;#34;HTTPPort&amp;#34;:9358},&amp;#34;message&amp;#34;:&amp;#34;Starting sdk sidecar&amp;#34;,&amp;#34;severity&amp;#34;:&amp;#34;info&amp;#34;,&amp;#34;source&amp;#34;:&amp;#34;main&amp;#34;,&amp;#34;time&amp;#34;:&amp;#34;2019-10-30T21:44:37.973139+03:00&amp;#34;,&amp;#34;version&amp;#34;:&amp;#34;1.1.0&amp;#34;}
{&amp;#34;grpcEndpoint&amp;#34;:&amp;#34;localhost:9357&amp;#34;,&amp;#34;message&amp;#34;:&amp;#34;Starting SDKServer grpc service...&amp;#34;,&amp;#34;severity&amp;#34;:&amp;#34;info&amp;#34;,&amp;#34;source&amp;#34;:&amp;#34;main&amp;#34;,&amp;#34;time&amp;#34;:&amp;#34;2019-10-30T21:44:37.974585+03:00&amp;#34;}
{&amp;#34;httpEndpoint&amp;#34;:&amp;#34;localhost:9358&amp;#34;,&amp;#34;message&amp;#34;:&amp;#34;Starting SDKServer grpc-gateway...&amp;#34;,&amp;#34;severity&amp;#34;:&amp;#34;info&amp;#34;,&amp;#34;source&amp;#34;:&amp;#34;main&amp;#34;,&amp;#34;time&amp;#34;:&amp;#34;2019-10-30T21:44:37.975086+03:00&amp;#34;}
{&amp;#34;message&amp;#34;:&amp;#34;Ready request has been received!&amp;#34;,&amp;#34;severity&amp;#34;:&amp;#34;info&amp;#34;,&amp;#34;time&amp;#34;:&amp;#34;2019-10-30T21:45:47.031989+03:00&amp;#34;}
{&amp;#34;message&amp;#34;:&amp;#34;gameserver update received&amp;#34;,&amp;#34;severity&amp;#34;:&amp;#34;info&amp;#34;,&amp;#34;time&amp;#34;:&amp;#34;2019-10-30T21:45:47.03225+03:00&amp;#34;}
{&amp;#34;message&amp;#34;:&amp;#34;Shutdown request has been received!&amp;#34;,&amp;#34;severity&amp;#34;:&amp;#34;info&amp;#34;,&amp;#34;time&amp;#34;:&amp;#34;2019-10-30T21:46:18.179341+03:00&amp;#34;}
{&amp;#34;message&amp;#34;:&amp;#34;gameserver update received&amp;#34;,&amp;#34;severity&amp;#34;:&amp;#34;info&amp;#34;,&amp;#34;time&amp;#34;:&amp;#34;2019-10-30T21:46:18.179459+03:00&amp;#34;}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;providing-your-own-gameserver-configuration-for-local-development&#34;&gt;Providing your own &lt;code&gt;GameServer&lt;/code&gt; configuration for local development&lt;/h3&gt;

&lt;p&gt;By default, the local sdk-server will create a dummy &lt;code&gt;GameServer&lt;/code&gt; configuration that is used for &lt;code&gt;GameServer()&lt;/code&gt;
and &lt;code&gt;WatchGameServer()&lt;/code&gt; SDK calls. If you wish to provide your own configuration, as either yaml or json, this
can be passed through as either &lt;code&gt;--file&lt;/code&gt; or &lt;code&gt;-f&lt;/code&gt; along with the &lt;code&gt;--local&lt;/code&gt; flag.&lt;/p&gt;

&lt;p&gt;If the &lt;code&gt;GamerServer&lt;/code&gt; configuration file is changed while the local server is running,
this will be picked up by the local server, and will change the current active configuration, as well as sending out
events for &lt;code&gt;WatchGameServer()&lt;/code&gt;. This is a useful way of testing functionality, such as changes of state from &lt;code&gt;Ready&lt;/code&gt; to
&lt;code&gt;Allocated&lt;/code&gt; in your game server code.&lt;/p&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
File modification events can fire more than one for each save (for a variety of reasons),
but it&amp;rsquo;s best practice to ensure handlers that implement &lt;code&gt;WatchGameServer()&lt;/code&gt; be idempotent regardless, as repeats can
happen when live as well.
&lt;/div&gt;


&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;$ wget https://raw.githubusercontent.com/googleforgames/agones/master/examples/simple-udp/gameserver.yaml
$ ./sdk-server.linux.amd64 --local -f ./gameserver.yaml
{&amp;#34;ctlConf&amp;#34;:{&amp;#34;Address&amp;#34;:&amp;#34;localhost&amp;#34;,&amp;#34;IsLocal&amp;#34;:true,&amp;#34;LocalFile&amp;#34;:&amp;#34;./gameserver.yaml&amp;#34;,&amp;#34;Delay&amp;#34;:0,&amp;#34;Timeout&amp;#34;:0,&amp;#34;Test&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;GRPCPort&amp;#34;:9357,&amp;#34;HTTPPort&amp;#34;:9358},&amp;#34;message&amp;#34;:&amp;#34;Starting sdk sidecar&amp;#34;,&amp;#34;severity&amp;#34;:&amp;#34;info&amp;#34;,&amp;#34;source&amp;#34;:&amp;#34;main&amp;#34;,&amp;#34;time&amp;#34;:&amp;#34;2019-10-30T21:47:45.742776+03:00&amp;#34;,&amp;#34;version&amp;#34;:&amp;#34;1.1.0&amp;#34;}
{&amp;#34;filePath&amp;#34;:&amp;#34;/Users/alexander.apalikov/Downloads/agonessdk-server-1.1.0/gameserver.yaml&amp;#34;,&amp;#34;message&amp;#34;:&amp;#34;Reading GameServer configuration&amp;#34;,&amp;#34;severity&amp;#34;:&amp;#34;info&amp;#34;,&amp;#34;time&amp;#34;:&amp;#34;2019-10-30T21:47:45.743369+03:00&amp;#34;}
{&amp;#34;grpcEndpoint&amp;#34;:&amp;#34;localhost:9357&amp;#34;,&amp;#34;message&amp;#34;:&amp;#34;Starting SDKServer grpc service...&amp;#34;,&amp;#34;severity&amp;#34;:&amp;#34;info&amp;#34;,&amp;#34;source&amp;#34;:&amp;#34;main&amp;#34;,&amp;#34;time&amp;#34;:&amp;#34;2019-10-30T21:47:45.759692+03:00&amp;#34;}
{&amp;#34;httpEndpoint&amp;#34;:&amp;#34;localhost:9358&amp;#34;,&amp;#34;message&amp;#34;:&amp;#34;Starting SDKServer grpc-gateway...&amp;#34;,&amp;#34;severity&amp;#34;:&amp;#34;info&amp;#34;,&amp;#34;source&amp;#34;:&amp;#34;main&amp;#34;,&amp;#34;time&amp;#34;:&amp;#34;2019-10-30T21:47:45.760312+03:00&amp;#34;}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;changing-state-of-a-local-gameserver&#34;&gt;Changing State of a Local GameServer&lt;/h3&gt;

&lt;p&gt;Some SDK calls would change the GameServer state according to &lt;a href=&#34;/site/site/docs/reference/gameserver/#gameserver-state-diagram&#34;&gt;GameServer State Diagram&lt;/a&gt;. Also local SDK server would persist labels and annotations updates.&lt;/p&gt;

&lt;p&gt;Here is a complete list of these commands: ready, allocate, setlabel, setannotation, shutdown, reserve.&lt;/p&gt;

&lt;p&gt;For example call to Reserve() for 30 seconds would change the GameServer state to Reserve and if no call to Allocate() occurs it would return back to Ready state after this period.&lt;/p&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
All state transitions are supported for local SDK server, however not all of them are valid in the real scenario. For instance, you cannot make a transition of a GameServer from Shutdown to a Ready state, but can do using local SDK server.
&lt;/div&gt;


&lt;p&gt;All changes to the GameServer state could be observed and retrieved using Watch() or GameServer() methods using GameServer SDK.&lt;/p&gt;

&lt;p&gt;Example of using HTTP gateway locally:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;$ curl -X POST &amp;#34;http://localhost:9358/ready&amp;#34; -H &amp;#34;accept: application/json&amp;#34; -H &amp;#34;Content-Type: application/json&amp;#34; -d &amp;#34;{}&amp;#34;
{}
$ curl -GET &amp;#34;http://localhost:9358/gameserver&amp;#34; -H &amp;#34;accept: application/json&amp;#34;
{&amp;#34;object_meta&amp;#34;:{&amp;#34;creation_timestamp&amp;#34;:&amp;#34;-62135596800&amp;#34;},&amp;#34;spec&amp;#34;:{&amp;#34;health&amp;#34;:{}},&amp;#34;status&amp;#34;:{&amp;#34;state&amp;#34;:&amp;#34;Ready&amp;#34;}}
$ curl -X PUT &amp;#34;http://localhost:9358/metadata/label&amp;#34; -H &amp;#34;accept: application/json&amp;#34; -H &amp;#34;Content-Type: application/json&amp;#34; -d &amp;#34;{ \&amp;#34;key\&amp;#34;: \&amp;#34;foo\&amp;#34;, \&amp;#34;value\&amp;#34;: \&amp;#34;bar\&amp;#34;}&amp;#34;
$ curl -GET &amp;#34;http://localhost:9358/gameserver&amp;#34; -H &amp;#34;accept: application/json&amp;#34;
{&amp;#34;object_meta&amp;#34;:{&amp;#34;creation_timestamp&amp;#34;:&amp;#34;-62135596800&amp;#34;,&amp;#34;labels&amp;#34;:{&amp;#34;agones.dev/sdk-foo&amp;#34;:&amp;#34;bar&amp;#34;}},&amp;#34;spec&amp;#34;:{&amp;#34;health&amp;#34;:{}},&amp;#34;status&amp;#34;:{&amp;#34;state&amp;#34;:&amp;#34;Ready&amp;#34;}}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
      </description>
    </item>
    
    <item>
      <title>Docs: Allocator Service</title>
      <link>/site/docs/advanced/allocator-service/</link>
      <pubDate>Tue, 19 May 2020 05:45:05 +0000</pubDate>
      
      <guid>/site/docs/advanced/allocator-service/</guid>
      <description>
        
        
        

&lt;p&gt;To allocate a game server, Agones in addition to 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/pkg/apis/allocation/v1/gameserverallocation.go&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;GameServerAllocations&lt;/a&gt;
, provides a gRPC service with mTLS authentication, called agones-allocator, which is on 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/proto/allocation&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;stable version&lt;/a&gt;
, starting on agones v1.6.&lt;/p&gt;

&lt;p&gt;The gRPC service is accessible through a Kubernetes service that is externalized using a load balancer. For the gRPC request to succeed, a client certificate must be provided that is in the authorization list of the allocator service.&lt;/p&gt;

&lt;p&gt;The remainder of this article describes how to manually make a successful allocation request using the gRPC API.&lt;/p&gt;

&lt;h2 id=&#34;find-the-external-ip&#34;&gt;Find the external IP&lt;/h2&gt;

&lt;p&gt;The service is hosted under the same namespace as the Agones controller. To find the external IP of your allocator service, replace agones-system namespace with the namespace to which Agones is deployed and execute the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;kubectl get service agones-allocator -n agones-system&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The output of the command should look like:&lt;/p&gt;

&lt;pre&gt;
NAME                        TYPE           CLUSTER-IP      &lt;b&gt;EXTERNAL-IP&lt;/b&gt;     PORT(S)            AGE
agones-allocator            LoadBalancer   10.55.251.73    &lt;b&gt;34.82.195.204&lt;/b&gt;   443:30250/TCP      7d22h
&lt;/pre&gt;

&lt;h2 id=&#34;server-tls-certificate&#34;&gt;Server TLS certificate&lt;/h2&gt;

&lt;p&gt;Replace the default server TLS certificate with a certificate with CN and subjectAltName. There are multiple approaches to generate a certificate. Agones recommends using &lt;a href=&#34;https://cert-manager.io/&#34;&gt;cert-manager.io&lt;/a&gt; solution for cluster level certificate management.&lt;/p&gt;

&lt;p&gt;In order to use cert-manager solution, first, &lt;a href=&#34;https://cert-manager.io/docs/installation/kubernetes/&#34;&gt;install cert-manager&lt;/a&gt; on the cluster. Then, &lt;a href=&#34;https://cert-manager.io/docs/configuration/&#34;&gt;configure&lt;/a&gt; an &lt;code&gt;Issuer&lt;/code&gt;/&lt;code&gt;ClusterIssuer&lt;/code&gt; resource and last configure a &lt;code&gt;Certificate&lt;/code&gt; resource to manage allocator-tls &lt;code&gt;Secret&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here is an example of using a self-signed &lt;code&gt;ClusterIssuer&lt;/code&gt; for configuring allocator-tls &lt;code&gt;Secret&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Create a self-signed ClusterIssuer&lt;/span&gt;
cat &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;lt;&amp;lt;EOF | kubectl apply -f -
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;apiVersion: cert-manager.io/v1alpha2
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;kind: ClusterIssuer
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;metadata:
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  name: selfsigned
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;spec:
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  selfSigned: {}
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;EOF&lt;/span&gt;

&lt;span style=&#34;color:#000&#34;&gt;EXTERNAL_IP&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;`&lt;/span&gt;kubectl get services agones-allocator -n agones-system -o &lt;span style=&#34;color:#000&#34;&gt;jsonpath&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;{.status.loadBalancer.ingress[0].ip}&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;`&lt;/span&gt;

&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Create a Certificate with IP for the allocator-tls secret&lt;/span&gt;
cat &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;lt;&amp;lt;EOF | kubectl apply -f -
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;apiVersion: cert-manager.io/v1alpha2
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;kind: Certificate
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;metadata:
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  name: allocator-selfsigned-cert
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  namespace: agones-system
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;spec:
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  commonName: ${EXTERNAL_IP}
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  ipAddresses:
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;    - ${EXTERNAL_IP}
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  secretName: allocator-tls
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  issuerRef:
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;    name: selfsigned
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;    kind: ClusterIssuer
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;EOF&lt;/span&gt;

&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Optional: Store the secret ca.crt in a file to be used by the client for the server authentication&lt;/span&gt;
&lt;span style=&#34;color:#000&#34;&gt;TLS_CA_FILE&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;ca.crt
&lt;span style=&#34;color:#000&#34;&gt;TLS_CA_VALUE&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;`&lt;/span&gt;kubectl get secret allocator-tls -n agones-system -ojsonpath&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;{.data.ca\.crt}&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;`&lt;/span&gt;
&lt;span style=&#34;color:#204a87&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;TLS_CA_VALUE&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; base64 -d &amp;gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;TLS_CA_FILE&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# In case of MacOS&lt;/span&gt;
&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# echo ${TLS_CA_VALUE} | base64 -D &amp;gt; ${TLS_CA_FILE}&lt;/span&gt;

&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Add ca.crt to the allocator-tls-ca Secret&lt;/span&gt;
kubectl get secret allocator-tls-ca -o json -n agones-system &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; jq &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;.data[&amp;#34;tls-ca.crt&amp;#34;]=&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;TLS_CA_VALUE&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; kubectl apply -f -&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;client-certificate&#34;&gt;Client Certificate&lt;/h2&gt;

&lt;p&gt;Because agones-allocator uses an mTLS authentication mechanism, client must provide a certificate that is accepted by the server. Here is an example of generating a client certificate. For the agones-allocator service to accept the newly generate client certificate, the generated client certificate CA or public portion of the certificate must be added to a kubernetes secret called &lt;code&gt;allocator-client-ca&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#000&#34;&gt;KEY_FILE&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;client.key
&lt;span style=&#34;color:#000&#34;&gt;CERT_FILE&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;client.crt

openssl req -x509 -nodes -days &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;365&lt;/span&gt; -newkey rsa:2048 -keyout &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;KEY_FILE&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt; -out &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;CERT_FILE&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color:#000&#34;&gt;CERT_FILE_VALUE&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;`&lt;/span&gt;cat &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;CERT_FILE&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; base64 -w &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;`&lt;/span&gt;

&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# In case of MacOS&lt;/span&gt;
&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# CERT_FILE_VALUE=`cat ${CERT_FILE} | base64`&lt;/span&gt;

&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# white-list client certificate&lt;/span&gt;
kubectl get secret allocator-client-ca -o json -n agones-system &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; jq &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;.data[&amp;#34;client_trial.crt&amp;#34;]=&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;CERT_FILE_VALUE&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; kubectl apply -f -&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The last command creates a new entry in the secret data map called &lt;code&gt;client_trial.crt&lt;/code&gt; for &lt;code&gt;allocator-client-ca&lt;/code&gt; and stores it. You can also achieve this by &lt;code&gt;kubectl edit secret allocator-client-ca -n agones-system&lt;/code&gt;, and then add the entry.&lt;/p&gt;

&lt;h2 id=&#34;restart-pods&#34;&gt;Restart pods&lt;/h2&gt;

&lt;p&gt;Restart pods to get the new TLS certificate loaded to the agones-allocator service.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;kubectl get pods -n agones-system -o&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;name &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; grep agones-allocator &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; xargs kubectl delete -n agones-system&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;send-allocation-request&#34;&gt;Send allocation request&lt;/h2&gt;

&lt;p&gt;Now the service is ready to accept requests from the client with the generated certificates. Create a &lt;a href=&#34;https://agones.dev/site/docs/getting-started/create-fleet/#1-create-a-fleet&#34;&gt;fleet&lt;/a&gt; and send a gRPC request to agones-allocator. To start, take a look at the allocation gRPC client examples in 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/allocator-client/main.go&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;golang&lt;/a&gt;
 and 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/allocator-client-csharp/Program.cs&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;C#&lt;/a&gt;
 languages. In the following, the 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/allocator-client/main.go&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;golang gRPC client example&lt;/a&gt;
 is used to allocate a Game Server in the default namespace.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#000&#34;&gt;NAMESPACE&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;default &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# replace with any namespace&lt;/span&gt;
&lt;span style=&#34;color:#000&#34;&gt;EXTERNAL_IP&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;`&lt;/span&gt;kubectl get services agones-allocator -n agones-system -o &lt;span style=&#34;color:#000&#34;&gt;jsonpath&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;{.status.loadBalancer.ingress[0].ip}&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;`&lt;/span&gt;
&lt;span style=&#34;color:#000&#34;&gt;KEY_FILE&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;client.key
&lt;span style=&#34;color:#000&#34;&gt;CERT_FILE&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;client.crt
&lt;span style=&#34;color:#000&#34;&gt;TLS_CA_FILE&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;ca.crt

go run examples/allocator-client/main.go --ip &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;EXTERNAL_IP&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --port &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;443&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --namespace &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;NAMESPACE&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --key &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;KEY_FILE&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --cert &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;CERT_FILE&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --cacert &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;TLS_CA_FILE&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If your matchmaker is external to the cluster on which your game servers are hosted, the &lt;code&gt;agones-allocator&lt;/code&gt; provides the gRPC API to allocate game services using mTLS authentication, which can scale independently to the Agones controller.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Multi-cluster Allocation</title>
      <link>/site/docs/advanced/multi-cluster-allocation/</link>
      <pubDate>Fri, 25 Oct 2019 05:45:05 +0000</pubDate>
      
      <guid>/site/docs/advanced/multi-cluster-allocation/</guid>
      <description>
        
        
        



&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Beta&lt;/h4&gt;
This feature is in a pre-release state and might change.
&lt;/div&gt;


&lt;p&gt;There may be different types of clusters, such as on-premise, and Google Kubernetes Engine (GKE), used by a game to help with the cost-saving and availability.
For this purpose, Agones provides a mechanism to define priorities on the clusters. Priorities are defined on 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/pkg/apis/multicluster/v1/gameserverallocationpolicy.go&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;GameServerAllocationPolicy&lt;/a&gt;
 agones CRD. A matchmaker can enable the multi-cluster rules on a request and target &lt;a href=&#34;/site/site/docs/advanced/allocator-service/&#34;&gt;agones-allocator&lt;/a&gt; endpoint in any of the clusters and get resources allocated on the cluster with the highest priority. If the cluster with the highest priority is overloaded, the allocation request is redirected to the cluster with the next highest priority.&lt;/p&gt;

&lt;p&gt;The remainder of this article describes how to enable multi-cluster allocation.&lt;/p&gt;

&lt;h2 id=&#34;define-cluster-priority&#34;&gt;Define Cluster Priority&lt;/h2&gt;

&lt;p&gt;
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/pkg/apis/multicluster/v1/gameserverallocationpolicy.go&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;GameServerAllocationPolicy&lt;/a&gt;
 is the CRD defined by Agones for setting multi-cluster allocation rules. In addition to cluster priority, it describes the connection information for the target cluster, including the game server namespace, agones-allocator endpoint and client K8s secrets name for redirecting the allocation request. Here is an example of setting the priority for a cluster and it&amp;rsquo;s connection rules. One such resource should be defined per cluster. For clusters with the same priority, the cluster is chosen with a probability relative to its weight.&lt;/p&gt;

&lt;p&gt;In the following example the policy is defined for cluster B in cluster A.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;cat &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;lt;&amp;lt;EOF | kubectl apply -f -
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;apiVersion: multicluster.agones.dev/v1
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;kind: GameServerAllocationPolicy
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;metadata:
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  name: allocator-cluster-B
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  namespace: cluster-A-ns
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;spec:
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  connectionInfo:
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;    allocationEndpoints:
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;    - 34.82.195.204
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;    clusterName: &amp;#34;clusterB&amp;#34;
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;    namespace: cluster-B-ns
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;    secretName: allocator-client-to-cluster-B
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;    serverCa: c2VydmVyQ0E=
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  priority: 1
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  weight: 100
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;EOF&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To define the local cluster priority, similarly, an allocation rule should be defined, while leaving allocationEndpoints unset. If the local cluster priority is not defined, the allocation from the local cluster happens only if allocation from other clusters with the existing allocation rules is unsuccessful.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;serverCa&lt;/code&gt; is the server TLS CA public certificate, set only if the remote server certificate is not signed by a public CA (e.g. self-signed). If this field is not specified, the certificate can also be specified in the &lt;code&gt;ca.crt&lt;/code&gt; field of the client secret (i.e. the secret referred to in the &lt;code&gt;secretName&lt;/code&gt; field).&lt;/p&gt;

&lt;h2 id=&#34;establish-trust&#34;&gt;Establish trust&lt;/h2&gt;

&lt;p&gt;To accept allocation requests from other clusters, agones-allocator for cluster B should be configured to accept the client&amp;rsquo;s certificate from cluster A and the cluster A&amp;rsquo;s client should be configured to accept the server TLS certificate, if it is not signed by a public Certificate Authority (CA).&lt;/p&gt;

&lt;p&gt;Follow the steps to configure the &lt;a href=&#34;/site/site/docs/advanced/allocator-service/&#34;&gt;agones allocator gRPC service&lt;/a&gt;. The client certificate pair in the mentioned document is stored as a K8s secret. Here are the secrets to set:&lt;/p&gt;

&lt;p&gt;1.Client certificate to talk to other clusters:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;cat &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;lt;&amp;lt;EOF | kubectl apply -f -
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;apiVersion: v1
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;kind: Secret
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;metadata:
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  name: allocator-client-to-cluster-B
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  namespace: cluster-A-ns
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;type: Opaque
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;data:
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  tls.crt: &amp;lt;REDACTED&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  tls.key: &amp;lt;REDACTED&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  ca.crt: &amp;lt;REDACTED&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;EOF&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The certificates are base 64 string of the certificate file e.g. &lt;code&gt;cat ${CERT_FILE} | base64 -w 0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Agones recommends using &lt;a href=&#34;https://cert-manager.io/&#34;&gt;cert-manager.io&lt;/a&gt; solution for generating client certificates.&lt;/p&gt;

&lt;p&gt;2.Add client CA to the list of authorized client certificates by agones-allocator in the targeted cluster.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;cat &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;lt;&amp;lt;EOF | kubectl apply -f -
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;apiVersion: v1
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;kind: Secret
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;metadata:
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  name: allocator-client-ca
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  namespace: agones-system
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;type: Opaque
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;data:
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  client1.crt: &amp;lt;REDACTED&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  client2.crt: &amp;lt;REDACTED&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  …
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;  clientN.crt: &amp;lt;REDACTED&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;EOF&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;allocate-multi-cluster&#34;&gt;Allocate multi-cluster&lt;/h2&gt;

&lt;p&gt;To enable multi-cluster allocation, set &lt;code&gt;multiClusterSetting.enabled&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; in 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/proto/allocation/allocation.proto&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;allocation.proto&lt;/a&gt;
 and send allocation requests. For more information visit &lt;a href=&#34;/site/site/docs/advanced/allocator-service/&#34;&gt;agones-allocator&lt;/a&gt;. In the following, using 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/allocator-client/main.go&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;allocator-client sample&lt;/a&gt;
, a multi-cluster allocation request is sent to the agones-allocator service.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;EXTERNAL_IP&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;`&lt;/span&gt;kubectl get services agones-allocator -n agones-system -o &lt;span style=&#34;color:#000&#34;&gt;jsonpath&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;{.status.loadBalancer.ingress[0].ip}&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;`&lt;/span&gt;

&lt;span style=&#34;color:#000&#34;&gt;NAMESPACE&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;default &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# replace with any namespace&lt;/span&gt;

go run examples/allocator-client/main.go --ip &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;EXTERNAL_IP&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --namespace &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;NAMESPACE&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --key &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;KEY_FILE&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --cert &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;CERT_FILE&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --cacert &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;TLS_CA_FILE&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --multicluster true&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
      </description>
    </item>
    
    <item>
      <title>Docs: Tutorial Build and Run a Simple Gameserver (Rust)</title>
      <link>/site/docs/tutorials/simple-gameserver-rust/</link>
      <pubDate>Tue, 30 Jul 2019 07:47:45 +0000</pubDate>
      
      <guid>/site/docs/tutorials/simple-gameserver-rust/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;objectives&#34;&gt;Objectives&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Run a simple gameserver&lt;/li&gt;
&lt;li&gt;Understand how the simple gameserver uses the Agones Rust SDK&lt;/li&gt;
&lt;li&gt;Build a customized version of the simple gameserver&lt;/li&gt;
&lt;li&gt;Run your customized simple gameserver&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://www.docker.com/get-started/&#34;&gt;Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Agones installed on GKE&lt;/li&gt;
&lt;li&gt;kubectl properly configured&lt;/li&gt;
&lt;li&gt;A local copy of the &lt;a href=&#34;https://github.com/googleforgames/agones/tree/master&#34;&gt;Agones repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A repository for Docker images, such as &lt;a href=&#34;https://hub.docker.com/&#34;&gt;Docker Hub&lt;/a&gt; or &lt;a href=&#34;https://cloud.google.com/container-registry/&#34;&gt;GC Container Registry&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To install on GKE, follow the install instructions (if you haven&amp;rsquo;t already) at
&lt;a href=&#34;/site/site/docs/installation/creating-cluster/gke/&#34;&gt;Setting up a Google Kubernetes Engine (GKE) cluster&lt;/a&gt;.
Also complete the &amp;ldquo;Installing Agones&amp;rdquo; instructions on the same page.&lt;/p&gt;

&lt;p&gt;While not required, you may wish to review the &lt;a href=&#34;/site/site/docs/getting-started/create-gameserver/&#34;&gt;Create a Game Server&lt;/a&gt;,
&lt;a href=&#34;/site/site/docs/getting-started/create-fleet/&#34;&gt;Create a Game Server Fleet&lt;/a&gt;, and/or &lt;a href=&#34;/site/site/docs/getting-started/edit-first-gameserver-go/&#34;&gt;Edit a Game Server&lt;/a&gt; quickstarts.&lt;/p&gt;

&lt;h3 id=&#34;1-run-the-simple-gameserver&#34;&gt;1. Run the simple gameserver&lt;/h3&gt;

&lt;p&gt;First, run the pre-built version of the simple gameserver and take note of the name that was created:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/rust-simple/gameserver.yaml
$ &lt;span style=&#34;color:#000&#34;&gt;GAMESERVER_NAME&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;$(&lt;/span&gt;kubectl get gs -o go-template --template &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;{{range .items}}{{.metadata.name}}{{&amp;#34;\n&amp;#34;}}{{end}}&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The game server sets up the Agones SDK, calls &lt;code&gt;sdk.ready()&lt;/code&gt; to inform Agones that it is ready to serve traffic,
prints a message every 10 seconds, and then calls &lt;code&gt;sdk.shutdown()&lt;/code&gt; after a minute to indicate that the gameserver
is going to exit.&lt;/p&gt;

&lt;p&gt;You can follow along with the lifecycle of the gameserver by running&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl logs &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GAMESERVER_NAME&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt; rust-simple -f&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;which should produce output similar to&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Rust Game Server has started!
Creating SDK instance
Setting a label
Starting to watch GameServer updates...
Health ping sent
Setting an annotation
Marking server as ready...
...marked Ready
Getting GameServer details...
GameServer name: rust-simple-txsc6
Running for 0 seconds
GameServer Update, name: rust-simple-txsc6
GameServer Update, state: Scheduled
GameServer Update, name: rust-simple-txsc6
GameServer Update, state: Scheduled
GameServer Update, name: rust-simple-txsc6
GameServer Update, state: RequestReady
GameServer Update, name: rust-simple-txsc6
GameServer Update, state: Ready
Health ping sent
Health ping sent
Health ping sent
Health ping sent
Health ping sent
Running for 10 seconds
GameServer Update, name: rust-simple-txsc6
GameServer Update, state: Ready
...
Shutting down after 60 seconds...
...marked for Shutdown
Running for 60 seconds
Health ping sent
GameServer Update, name: rust-simple-txsc6
GameServer Update, state: Shutdown
GameServer Update, name: rust-simple-txsc6
GameServer Update, state: Shutdown
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If everything goes as expected, the gameserver will exit automatically after about a minute.&lt;/p&gt;

&lt;p&gt;In some cases, the gameserver goes into an unhealthy state, in which case it will be restarted indefinitely.
If this happens, you can manually remove it by running&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl delete gs &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GAMESERVER_NAME&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;2-build-a-simple-gameserver&#34;&gt;2. Build a simple gameserver&lt;/h3&gt;

&lt;p&gt;Change directories to your local agones/examples/rust-simple directory. To experiment with the SDK, open up &lt;code&gt;main.rs&lt;/code&gt;
in your favorite editor and change the interval at which the gameserver calls &lt;code&gt;sdk.health()&lt;/code&gt; from 2 seconds to 20
seconds by modifying the line in the thread assigned to &lt;code&gt;let _health&lt;/code&gt; to be&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;thread&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;sleep&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Duration&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;from_secs&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;20&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;));&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Next build a new docker image by running&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ &lt;span style=&#34;color:#204a87&#34;&gt;cd&lt;/span&gt; examples/rust-simple
$ &lt;span style=&#34;color:#000&#34;&gt;REPOSITORY&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&amp;lt;your-repository&amp;gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# e.g. gcr.io/agones-images&lt;/span&gt;
$ make build-image &lt;span style=&#34;color:#000&#34;&gt;REPOSITORY&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;REPOSITORY&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The multi-stage Dockerfile will pull down all of the dependencies needed to build the image. Note that it is normal
for this to take several minutes to complete.&lt;/p&gt;

&lt;p&gt;Once the container has been built, push it to your repository&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ docker push &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;REPOSITORY&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/rust-simple-server:0.4&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;3-run-the-customized-gameserver&#34;&gt;3. Run the customized gameserver&lt;/h3&gt;

&lt;p&gt;Now it is time to deploy your newly created gameserver container into your Agones cluster.&lt;/p&gt;

&lt;p&gt;First, you need to edit &lt;code&gt;examples/rust-simple/gameserver.yaml&lt;/code&gt; to point to your new image:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;containers:
- name: rust-simple
  image: $(REPOSITORY)/rust-simple-server:0.4
  imagePullPolicy: Always
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then, deploy your gameserver&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl create -f gameserver.yaml
$ &lt;span style=&#34;color:#000&#34;&gt;GAMESERVER_NAME&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;$(&lt;/span&gt;kubectl get gs -o go-template --template &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;{{range .items}}{{.metadata.name}}{{&amp;#34;\n&amp;#34;}}{{end}}&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Again, follow along with the lifecycle of the gameserver by running&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl logs &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GAMESERVER_NAME&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt; rust-simple -f&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;which should produce output similar to&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Rust Game Server has started!
Creating SDK instance
Setting a label
Starting to watch GameServer updates...
Health ping sent
Setting an annotation
Marking server as ready...
...marked Ready
Getting GameServer details...
GameServer name: rust-simple-z6lz8
Running for 0 seconds
GameServer Update, name: rust-simple-z6lz8
GameServer Update, state: Scheduled
GameServer Update, name: rust-simple-z6lz8
GameServer Update, state: RequestReady
GameServer Update, name: rust-simple-z6lz8
GameServer Update, state: RequestReady
GameServer Update, name: rust-simple-z6lz8
GameServer Update, state: Ready
Running for 10 seconds
GameServer Update, name: rust-simple-z6lz8
GameServer Update, state: Ready
GameServer Update, name: rust-simple-z6lz8
GameServer Update, state: Unhealthy
Health ping sent
Running for 20 seconds
Running for 30 seconds
Health ping sent
Running for 40 seconds
GameServer Update, name: rust-simple-z6lz8
GameServer Update, state: Unhealthy
Running for 50 seconds
Health ping sent
Shutting down after 60 seconds...
...marked for Shutdown
Running for 60 seconds
Running for 70 seconds
GameServer Update, name: rust-simple-z6lz8
GameServer Update, state: Unhealthy
Health ping sent
Running for 80 seconds
Running for 90 seconds
Health ping sent
Rust Game Server finished.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;with the slower healthcheck interval, the gameserver gets automatically marked an &lt;code&gt;Unhealthy&lt;/code&gt; by Agones.&lt;/p&gt;

&lt;p&gt;To finish, clean up the gameserver by manually removing it&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl delete gs &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GAMESERVER_NAME&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
      </description>
    </item>
    
    <item>
      <title>Docs: Tutorial Build and Run a Simple Gameserver (node.js)</title>
      <link>/site/docs/tutorials/simple-gameserver-nodejs/</link>
      <pubDate>Thu, 25 Jul 2019 17:34:37 +0000</pubDate>
      
      <guid>/site/docs/tutorials/simple-gameserver-nodejs/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;objectives&#34;&gt;Objectives&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Run a simple gameserver&lt;/li&gt;
&lt;li&gt;Understand how the simple gameserver uses the Agones node.js SDK&lt;/li&gt;
&lt;li&gt;Build a customized version of the simple gameserver&lt;/li&gt;
&lt;li&gt;Run your customized simple gameserver&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://www.docker.com/get-started/&#34;&gt;Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Agones installed on GKE&lt;/li&gt;
&lt;li&gt;kubectl properly configured&lt;/li&gt;
&lt;li&gt;A local copy of the &lt;a href=&#34;https://github.com/googleforgames/agones/tree/master&#34;&gt;Agones repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A repository for Docker images, such as &lt;a href=&#34;https://hub.docker.com/&#34;&gt;Docker Hub&lt;/a&gt; or &lt;a href=&#34;https://cloud.google.com/container-registry/&#34;&gt;GC Container Registry&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To install on GKE, follow the install instructions (if you haven&amp;rsquo;t already) at
&lt;a href=&#34;/site/site/docs/installation/creating-cluster/gke/&#34;&gt;Setting up a Google Kubernetes Engine (GKE) cluster&lt;/a&gt;.
Also complete the &amp;ldquo;Installing Agones&amp;rdquo; instructions on the same page.&lt;/p&gt;

&lt;p&gt;While not required, you may wish to review the &lt;a href=&#34;/site/site/docs/getting-started/create-gameserver/&#34;&gt;Create a Game Server&lt;/a&gt;,
&lt;a href=&#34;/site/site/docs/getting-started/create-fleet/&#34;&gt;Create a Game Server Fleet&lt;/a&gt;, and/or &lt;a href=&#34;/site/site/docs/getting-started/edit-first-gameserver-go/&#34;&gt;Edit a Game Server&lt;/a&gt; quickstarts.&lt;/p&gt;

&lt;h3 id=&#34;1-run-the-simple-gameserver&#34;&gt;1. Run the simple gameserver&lt;/h3&gt;

&lt;p&gt;First, run the pre-built version of the simple gameserver and take note of the name that was created:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/nodejs-simple/gameserver.yaml
$ &lt;span style=&#34;color:#000&#34;&gt;GAMESERVER_NAME&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;$(&lt;/span&gt;kubectl get gs -o go-template --template &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;{{range .items}}{{.metadata.name}}{{&amp;#34;\n&amp;#34;}}{{end}}&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The game server sets up the Agones SDK, calls &lt;code&gt;sdk.ready()&lt;/code&gt; to inform Agones that it is ready to serve traffic,
prints a message every 10 seconds, and then calls &lt;code&gt;sdk.shutdown()&lt;/code&gt; after a minute to indicate that the gameserver
is going to exit.&lt;/p&gt;

&lt;p&gt;You can follow along with the lifecycle of the gameserver by running&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl logs &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GAMESERVER_NAME&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt; nodejs-simple -f&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;which should produce output similar to&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; @ start /home/server/examples/nodejs-simple
&amp;gt; node src/index.js

node.js Game Server has started!
Setting a label
(node:20) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
Setting an annotation
Marking server as ready...
...marked Ready
GameServer Update:
	name: nodejs-simple-9bw4g 
	state: Scheduled
GameServer Update:
	name: nodejs-simple-9bw4g 
	state: RequestReady
GameServer Update:
	name: nodejs-simple-9bw4g 
	state: RequestReady
GameServer Update:
	name: nodejs-simple-9bw4g 
	state: Ready
Health ping sent
Health ping sent
Health ping sent
Health ping sent
Health ping sent
Running for 10 seconds!
Health ping sent
Health ping sent
Health ping sent
Health ping sent
Running for 20 seconds!
Health ping sent
Health ping sent
Health ping sent
Health ping sent
Health ping sent
GameServer Update:
	name: nodejs-simple-9bw4g 
	state: Ready
Running for 30 seconds!
Health ping sent
Health ping sent
Health ping sent
Health ping sent
Health ping sent
Running for 40 seconds!
Health ping sent
Health ping sent
Health ping sent
Health ping sent
Health ping sent
Running for 50 seconds!
Health ping sent
Health ping sent
Health ping sent
Health ping sent
Health ping sent
GameServer Update:
	name: nodejs-simple-9bw4g 
	state: Ready
Running for 60 seconds!
Shutting down after 60 seconds...
...marked for Shutdown
GameServer Update:
	name: nodejs-simple-9bw4g 
	state: Shutdown
Health ping sent
GameServer Update:
	name: nodejs-simple-9bw4g 
	state: Shutdown
Health ping sent
Health ping sent
Health ping sent
Health ping sent
Running for 70 seconds!
Health ping sent
Health ping sent
Health ping sent
Health ping sent
Health ping sent
Running for 80 seconds!
Health ping sent
Health ping sent
Health ping sent
Health ping sent
Health ping sent
Running for 90 seconds!
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If everything goes as expected, the gameserver will exit automatically after about a minute.&lt;/p&gt;

&lt;p&gt;In some cases, the gameserver goes into an unhealthy state, in which case it will be restarted indefinitely.
If this happens, you can manually remove it by running&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl delete gs &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GAMESERVER_NAME&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;2-build-a-simple-gameserver&#34;&gt;2. Build a simple gameserver&lt;/h3&gt;

&lt;p&gt;Change directories to your local agones/examples/nodejs-simple directory. To experiment with the SDK, open up
&lt;code&gt;src/index.js&lt;/code&gt; in your favorite editor and change the interval at which the gameserver calls &lt;code&gt;sdk.health()&lt;/code&gt; from
2 seconds to 20 seconds by modifying the lines in the health ping handler to be&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;setInterval(() =&amp;gt; {
	agonesSDK.health();
	console.log(&#39;Health ping sent&#39;);
}, 20000);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Next build a new docker image by running&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ &lt;span style=&#34;color:#204a87&#34;&gt;cd&lt;/span&gt; examples/nodejs-simple
$ &lt;span style=&#34;color:#000&#34;&gt;REPOSITORY&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&amp;lt;your-repository&amp;gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# e.g. gcr.io/agones-images&lt;/span&gt;
$ make build &lt;span style=&#34;color:#000&#34;&gt;REPOSITORY&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;REPOSITORY&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Once the container has been built, push it to your repository&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ docker push &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;REPOSITORY&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/nodejs-simple-server:0.1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;3-run-the-customized-gameserver&#34;&gt;3. Run the customized gameserver&lt;/h3&gt;

&lt;p&gt;Now it is time to deploy your newly created gameserver container into your Agones cluster.&lt;/p&gt;

&lt;p&gt;First, you need to edit &lt;code&gt;examples/nodejs-simple/gameserver.yaml&lt;/code&gt; to point to your new image:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;containers:
- name: nodejs-simple
  image: $(REPOSITORY)/nodejs-simple-server:0.1
  imagePullPolicy: Always
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then, deploy your gameserver&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl create -f gameserver.yaml
$ &lt;span style=&#34;color:#000&#34;&gt;GAMESERVER_NAME&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;$(&lt;/span&gt;kubectl get gs -o go-template --template &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;{{range .items}}{{.metadata.name}}{{&amp;#34;\n&amp;#34;}}{{end}}&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Again, follow along with the lifecycle of the gameserver by running&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl logs &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GAMESERVER_NAME&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt; nodejs-simple -f&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;which should produce output similar to&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; @ start /home/server/examples/nodejs-simple
&amp;gt; node src/index.js

node.js Game Server has started!
Setting a label
(node:20) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
Setting an annotation
Marking server as ready...
...marked Ready
GameServer Update:
	name: nodejs-simple-qkpqn 
	state: Scheduled
GameServer Update:
	name: nodejs-simple-qkpqn 
	state: Scheduled
GameServer Update:
	name: nodejs-simple-qkpqn 
	state: RequestReady
GameServer Update:
	name: nodejs-simple-qkpqn 
	state: Ready
Running for 10 seconds!
GameServer Update:
	name: nodejs-simple-qkpqn 
	state: Unhealthy
Health ping sent
Running for 20 seconds!
GameServer Update:
	name: nodejs-simple-qkpqn 
	state: Unhealthy
Running for 30 seconds!
Health ping sent
Running for 40 seconds!
Running for 50 seconds!
GameServer Update:
	name: nodejs-simple-qkpqn 
	state: Unhealthy
Health ping sent
Shutting down after 60 seconds...
...marked for Shutdown
Running for 60 seconds!
Running for 70 seconds!
Health ping sent
Running for 80 seconds!
GameServer Update:
	name: nodejs-simple-qkpqn 
	state: Unhealthy
Running for 90 seconds!
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;with the slower healthcheck interval, the gameserver gets automatically marked an &lt;code&gt;Unhealthy&lt;/code&gt; by Agones.&lt;/p&gt;

&lt;p&gt;To finish, clean up the gameserver by manually removing it&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl delete gs &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GAMESERVER_NAME&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
      </description>
    </item>
    
    <item>
      <title>Docs: Tutorial Build and Run a Simple Gameserver (C&#43;&#43;)</title>
      <link>/site/docs/tutorials/simple-gameserver-cpp/</link>
      <pubDate>Wed, 24 Jul 2019 05:52:12 +0000</pubDate>
      
      <guid>/site/docs/tutorials/simple-gameserver-cpp/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;objectives&#34;&gt;Objectives&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Run a simple gameserver&lt;/li&gt;
&lt;li&gt;Understand how the simple gameserver uses the Agones C++ SDK&lt;/li&gt;
&lt;li&gt;Build a customized version of the simple gameserver&lt;/li&gt;
&lt;li&gt;Run your customized simple gameserver&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://www.docker.com/get-started/&#34;&gt;Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Agones installed on GKE&lt;/li&gt;
&lt;li&gt;kubectl properly configured&lt;/li&gt;
&lt;li&gt;A local copy of the &lt;a href=&#34;https://github.com/googleforgames/agones/tree/master&#34;&gt;Agones repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A repository for Docker images, such as &lt;a href=&#34;https://hub.docker.com/&#34;&gt;Docker Hub&lt;/a&gt; or &lt;a href=&#34;https://cloud.google.com/container-registry/&#34;&gt;GC Container Registry&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To install on GKE, follow the install instructions (if you haven&amp;rsquo;t already) at
&lt;a href=&#34;/site/site/docs/installation/creating-cluster/gke/&#34;&gt;Setting up a Google Kubernetes Engine (GKE) cluster&lt;/a&gt;.
Also complete the &amp;ldquo;Installing Agones&amp;rdquo; instructions on the same page.&lt;/p&gt;

&lt;p&gt;While not required, you may wish to review the &lt;a href=&#34;/site/site/docs/getting-started/create-gameserver/&#34;&gt;Create a Game Server&lt;/a&gt;,
&lt;a href=&#34;/site/site/docs/getting-started/create-fleet/&#34;&gt;Create a Game Server Fleet&lt;/a&gt;, and/or &lt;a href=&#34;/site/site/docs/getting-started/edit-first-gameserver-go/&#34;&gt;Edit a Game Server&lt;/a&gt; quickstarts.&lt;/p&gt;

&lt;h3 id=&#34;1-run-the-simple-gameserver&#34;&gt;1. Run the simple gameserver&lt;/h3&gt;

&lt;p&gt;First, run the pre-built version of the simple gameserver and take note of the name that was created:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/cpp-simple/gameserver.yaml
$ &lt;span style=&#34;color:#000&#34;&gt;GAMESERVER_NAME&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;$(&lt;/span&gt;kubectl get gs -o go-template --template &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;{{range .items}}{{.metadata.name}}{{&amp;#34;\n&amp;#34;}}{{end}}&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The game server sets up the Agones SDK, calls &lt;code&gt;SDK::Ready()&lt;/code&gt; to inform Agones that it is ready to serve traffic,
prints a message every 10 seconds, and then calls &lt;code&gt;SDK::Shutdown()&lt;/code&gt; after a minute to indicate that the gameserver
is going to exit.&lt;/p&gt;

&lt;p&gt;You can follow along with the lifecycle of the gameserver by running&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl logs &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GAMESERVER_NAME&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt; cpp-simple -f&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;which should produce output similar to&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;C++ Game Server has started!
Getting the instance of the SDK!
Attempting to connect...
...handshake complete.
Setting a label
Starting to watch GameServer updates...
Health ping sent
Setting an annotation
Marking server as ready...
...marked Ready
Getting GameServer details...
GameServer name: cpp-simple-tlgzp
Running for 0 seconds !
GameServer Update:
	name: cpp-simple-tlgzp
	state: Scheduled
GameServer Update:
	name: cpp-simple-tlgzp
	state: RequestReady
GameServer Update:
	name: cpp-simple-tlgzp
	state: RequestReady
GameServer Update:
	name: cpp-simple-tlgzp
	state: Ready
Health ping sent
Health ping sent
Health ping sent
Health ping sent
Health ping sent
Running for 10 seconds !
Health ping sent
...
GameServer Update:
	name: cpp-simple-2mtdc
	state: Ready
Shutting down after 60 seconds...
...marked for Shutdown
Running for 60 seconds !
Health ping sent
GameServer Update:
	name: cpp-simple-2mtdc
	state: Shutdown
GameServer Update:
	name: cpp-simple-2mtdc
	state: Shutdown
Health ping failed
Health ping failed
Health ping failed
Health ping failed
Running for 70 seconds !
Health ping failed
Health ping failed
Health ping failed
Health ping failed
Health ping failed
Running for 80 seconds !
Health ping failed
Health ping failed
Health ping failed
Health ping failed
Health ping failed
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If everything goes as expected, the gameserver will exit automatically after about a minute.&lt;/p&gt;

&lt;p&gt;In some cases, the gameserver goes into an unhealthy state, in which case it will be restarted indefinitely.
If this happens, you can manually remove it by running&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl delete gs &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GAMESERVER_NAME&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;2-run-a-fleet-of-simple-gameservers&#34;&gt;2. Run a fleet of simple gameservers&lt;/h3&gt;

&lt;p&gt;Next, run a fleet of gameservers&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/master/examples/cpp-simple/fleet.yaml
$ &lt;span style=&#34;color:#000&#34;&gt;FLEET_NAME&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;$(&lt;/span&gt;kubectl get fleets -o go-template --template &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;{{range .items}}{{.metadata.name}}{{&amp;#34;\n&amp;#34;}}{{end}}&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can again inspect the output of an individual gameserver (which will look the same as above), but what is more
interesting is to watch the set of all gameservers over time. Each gameserver exits after about a minute, but a fleet
is responsible for keeping a sufficient number of gameservers in the &lt;code&gt;Ready&lt;/code&gt; state. So as each gameserver exits, it
is replaced by a new one. You can see this in action by running&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ watch &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;kubectl get gameservers&amp;#34;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;which should show how gameservers are constantly transitioning from &lt;code&gt;Scheduled&lt;/code&gt; to &lt;code&gt;Ready&lt;/code&gt; to &lt;code&gt;Shutdown&lt;/code&gt; before
disappearing.&lt;/p&gt;

&lt;p&gt;When you are finished watching the fleet produce new gameservers you should remove the fleet by running&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl delete fleet &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;FLEET_NAME&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;3-build-a-simple-gameserver&#34;&gt;3. Build a simple gameserver&lt;/h3&gt;

&lt;p&gt;Change directories to your local agones/examples/cpp-simple directory. To experiment with the SDK, open up &lt;code&gt;server.cc&lt;/code&gt;
in your favorite editor and change the interval at which the gameserver calls &lt;code&gt;SDK::Health&lt;/code&gt; from 2 seconds to 20
seconds by modifying the line in &lt;code&gt;DoHealth&lt;/code&gt; to be&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;this_thread&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;sleep_for&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;chrono&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;seconds&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;20&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Next build a new docker image by running&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ &lt;span style=&#34;color:#204a87&#34;&gt;cd&lt;/span&gt; examples/cpp-simple
$ &lt;span style=&#34;color:#000&#34;&gt;REPOSITORY&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&amp;lt;your-repository&amp;gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# e.g. gcr.io/agones-images&lt;/span&gt;
$ make build &lt;span style=&#34;color:#000&#34;&gt;REPOSITORY&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;REPOSITORY&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The multi-stage Dockerfile will pull down all of the dependencies needed to build the image. Note that it is normal
for this to take several minutes to complete.&lt;/p&gt;

&lt;p&gt;Once the container has been built, push it to your repository&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ docker push &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;REPOSITORY&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/cpp-simple-server:0.6&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;4-run-the-customized-gameserver&#34;&gt;4. Run the customized gameserver&lt;/h3&gt;

&lt;p&gt;Now it is time to deploy your newly created gameserver container into your Agones cluster.&lt;/p&gt;

&lt;p&gt;First, you need to edit &lt;code&gt;examples/cpp-simple/gameserver.yaml&lt;/code&gt; to point to your new image:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;containers:
- name: cpp-simple
  image: $(REPOSITORY)/cpp-simple-server:0.6
  imagePullPolicy: Always # add for development
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then, deploy your gameserver&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl create -f gameserver.yaml
$ &lt;span style=&#34;color:#000&#34;&gt;GAMESERVER_NAME&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;$(&lt;/span&gt;kubectl get gs -o go-template --template &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;{{range .items}}{{.metadata.name}}{{&amp;#34;\n&amp;#34;}}{{end}}&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Again, follow along with the lifecycle of the gameserver by running&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl logs &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GAMESERVER_NAME&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt; cpp-simple -f&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;which should produce output similar to&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;C++ Game Server has started!
Getting the instance of the SDK!
Attempting to connect...
...handshake complete.
Setting a label
Health ping sent
Starting to watch GameServer updates...
Setting an annotation
Marking server as ready...
...marked Ready
Getting GameServer details...
GameServer name: cpp-simple-f255n
Running for 0 seconds !
GameServer Update:
	name: cpp-simple-f255n
	state: Scheduled
GameServer Update:
	name: cpp-simple-f255n
	state: Scheduled
GameServer Update:
	name: cpp-simple-f255n
	state: RequestReady
GameServer Update:
	name: cpp-simple-f255n
	state: Ready
Running for 10 seconds !
GameServer Update:
	name: cpp-simple-f255n
	state: Unhealthy
Health ping sent
Running for 20 seconds !
GameServer Update:
	name: cpp-simple-f255n
	state: Unhealthy
Running for 30 seconds !
Health ping sent
Running for 40 seconds !
Running for 50 seconds !
GameServer Update:
	name: cpp-simple-f255n
	state: Unhealthy
Health ping sent
Shutting down after 60 seconds...
...marked for Shutdown
Running for 60 seconds !
Running for 70 seconds !
Health ping sent
Running for 80 seconds !
GameServer Update:
	name: cpp-simple-f255n
	state: Unhealthy
Running for 90 seconds !
Health ping sent
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;with the slower healthcheck interval, the gameserver gets automatically marked an &lt;code&gt;Unhealthy&lt;/code&gt; by Agones.&lt;/p&gt;

&lt;p&gt;To finish, clean up the gameserver by manually removing it&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ kubectl delete gs &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GAMESERVER_NAME&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
      </description>
    </item>
    
    <item>
      <title>Docs: GameServer Pod Service Accounts</title>
      <link>/site/docs/advanced/service-accounts/</link>
      <pubDate>Thu, 14 Mar 2019 04:30:37 +0000</pubDate>
      
      <guid>/site/docs/advanced/service-accounts/</guid>
      <description>
        
        
        

&lt;h2 id=&#34;default-settings&#34;&gt;Default Settings&lt;/h2&gt;

&lt;p&gt;By default, Agones sets up service accounts and sets them appropriately for the &lt;code&gt;Pods&lt;/code&gt; that are created for &lt;code&gt;GameServers&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Since Agones provides &lt;code&gt;GameServer&lt;/code&gt; &lt;code&gt;Pods&lt;/code&gt; with a sidecar container that needs access to Agones Custom Resource Definitions,
&lt;code&gt;Pods&lt;/code&gt; are configured with a service account with extra RBAC permissions to ensure that it can read and modify the resources it needs.&lt;/p&gt;

&lt;p&gt;Since service accounts apply to all containers in a &lt;code&gt;Pod&lt;/code&gt;, Agones will automatically overwrite the mounted key for the
service account in the container that is running the dedicated game server in the backing &lt;code&gt;Pod&lt;/code&gt;. This is done
since game server containers are exposed publicly, and generally don&amp;rsquo;t require the extra permissions to access aspects
of the Kubernetes API.&lt;/p&gt;

&lt;h2 id=&#34;bringing-your-own-service-account&#34;&gt;Bringing your own Service Account&lt;/h2&gt;

&lt;p&gt;If needed, you can provide your own service account on the &lt;code&gt;Pod&lt;/code&gt; specification in the &lt;code&gt;GameServer&lt;/code&gt; configuration.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;apiVersion&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;agones.dev/v1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;kind&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;GameServer&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;metadata&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;generateName&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;simple-udp-&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;ports&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;default&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;containerPort&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;7654&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;template&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;spec&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;serviceAccountName&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;my-special-service-account&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# a custom service account&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;containers&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;-&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;simple-udp&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;image&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;gcr.io/agones-images/udp-server&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0.21&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If a service account is configured, the mounted key is not overwritten, as it assumed that you want to have full control
of the service account and underlying RBAC permissions.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Tutorial Create an Allocator Service</title>
      <link>/site/docs/tutorials/allocator-service-go/</link>
      <pubDate>Thu, 03 Jan 2019 03:15:34 +0000</pubDate>
      
      <guid>/site/docs/tutorials/allocator-service-go/</guid>
      <description>
        
        
        

&lt;p&gt;To do this, we will implement a &lt;a href=&#34;https://kubernetes.io/docs/concepts/services-networking/service/&#34;&gt;Service&lt;/a&gt; which allocates a
Game Server on demand by calling the Create() method of the GameServerAllocationInterface.  After creating the fleet
allocation, we will return the JSON encoded GameServerStatus of the allocated GameServer.&lt;/p&gt;

&lt;p&gt;The type of service we will be learning about could be used by a game client to connect directly to a dedicated Game Server, as part of a larger system, such as a matchmaker service, or in conjunction with a database of level transition data.  We will be using the service as a vehicle with which to execute the API calls found in our main.go file.&lt;/p&gt;

&lt;h2 id=&#34;objectives&#34;&gt;Objectives&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create a secure allocator service&lt;/li&gt;
&lt;li&gt;Deploy the service to &lt;a href=&#34;https://cloud.google.com/kubernetes-engine/&#34;&gt;GKE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Allocate a Game Server from a Fleet using the Agones API&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://www.docker.com/get-started/&#34;&gt;Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Agones installed on GKE, running a simple-udp fleet&lt;/li&gt;
&lt;li&gt;kubectl properly configured&lt;/li&gt;
&lt;li&gt;A local copy of the 
&lt;a href=&#34;https://github.com/googleforgames/agones/blob/master/examples/allocator-service&#34; target=&#34;_blank&#34; data-proofer-ignore&gt;allocator service&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A repository for Docker images, such as &lt;a href=&#34;https://hub.docker.com/&#34;&gt;Docker Hub&lt;/a&gt; or &lt;a href=&#34;https://cloud.google.com/container-registry/&#34;&gt;GC Container Registry&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To install on GKE, follow the install instructions (if you haven&amp;rsquo;t already) at
&lt;a href=&#34;/site/site/docs/installation/creating-cluster/gke/&#34;&gt;Setting up a Google Kubernetes Engine (GKE) cluster&lt;/a&gt;.
Also complete the &amp;ldquo;Installing Agones&amp;rdquo; instructions on the same page.&lt;/p&gt;

&lt;p&gt;While not required, you may wish to review the &lt;a href=&#34;/site/site/docs/getting-started/create-gameserver/&#34;&gt;Create a Game Server&lt;/a&gt;,
&lt;a href=&#34;/site/site/docs/getting-started/create-fleet/&#34;&gt;Create a Game Server Fleet&lt;/a&gt;, and/or &lt;a href=&#34;/site/site/docs/getting-started/edit-first-gameserver-go/&#34;&gt;Edit a Game Server&lt;/a&gt; quickstarts.&lt;/p&gt;

&lt;h3 id=&#34;1-build-and-push-the-service&#34;&gt;1. Build and Push the Service&lt;/h3&gt;

&lt;p&gt;Change directories to your local agones/examples/allocator-service directory and build a new docker image.  The multi-stage Dockerfile will pull down all the dependencies for you and build the executable.  For example, where USER is your username, REPO is your repository, and TAG is your tag:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;docker build -t [USER]/allocator-service:[TAG] .
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Push it to your repository:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;docker push [USER]/allocator-service:[TAG]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Edit allocator-service.yaml to point to your new image:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;containers:
- name: fleet-allocator
  image: [REPO]/[USER]/allocator-service:[TAG]
  imagePullPolicy: Always
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;2-create-firewall-rules&#34;&gt;2. Create Firewall Rules&lt;/h3&gt;

&lt;p&gt;Let&amp;rsquo;s making some firewall rules that will be used by kubernetes health checks and the ingress which we will create shortly.&lt;/p&gt;

&lt;p&gt;First, we will make one for the HTTPS health checks that will be sent to our service by running:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gcloud compute firewall-rules create fleet-allocator-healthcheck \
  --allow tcp \
  --source-ranges 130.211.0.0/22,35.191.0.0/16 \
  --target-tags fleet-allocator \
  --description &amp;quot;Firewall to allow health check of fleet allocator service&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The output should be something like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Creating firewall...done.                                            
NAME                         NETWORK  DIRECTION  PRIORITY  ALLOW  DENY  DISABLED
fleet-allocator-healthcheck  default  INGRESS    1000      tcp          False
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Create a firewall rule for nodePort traffic on the range of ports used by Ingress services of type nodePort.  We are using nodePort because it supports TLS.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gcloud compute firewall-rules create nodeport-rule \
  --allow=tcp:30000-32767 \
  --target-tags fleet-allocator \
  --description &amp;quot;Firewall to allow nodePort traffic of fleet allocator service&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The output should be something like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Creating firewall...done.                                            
NAME           NETWORK  DIRECTION  PRIORITY  ALLOW            DENY  DISABLED
nodeport-rule  default  INGRESS    1000      tcp:30000-32767        False
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;3-make-it-secure&#34;&gt;3. Make It Secure&lt;/h3&gt;

&lt;p&gt;Let&amp;rsquo;s keep security in mind from the beginning by creating a certificate, key and secret for the allocator service, and another set for the web server.&lt;/p&gt;

&lt;p&gt;Pick a more permanent location for the files if you like - /tmp may be purged depending on your operating system.&lt;/p&gt;

&lt;p&gt;Create a public private key pair for the allocator service:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /tmp/allocsvc.key -out  /tmp/allocsvc.crt -subj &amp;quot;/CN=my-allocator/O=my-allocator&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The output should be something like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Generating a 2048 bit RSA private key
....................................................+++
......................+++
writing new private key to &#39;/tmp/allocsvc.key&#39;
-----
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Create a public private key pair that will be bound to the pod and used by the web server :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /tmp/tls.key -out  /tmp/tls.crt -subj &amp;quot;/CN=my-allocator-w3/O=my-allocator-w3&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The output should be something like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Generating a 2048 bit RSA private key
....................................................+++
......................+++
writing new private key to &#39;/tmp/tls.key&#39;
-----
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;4-create-kubernetes-secrets&#34;&gt;4. Create Kubernetes Secrets&lt;/h3&gt;

&lt;p&gt;The allocatorsecret will allow the service to use TLS for connections with workers.&lt;/p&gt;

&lt;p&gt;Create the &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/secret/&#34;&gt;secret&lt;/a&gt; by running this command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl create secret tls allocatorsecret --cert=/tmp/allocsvc.crt --key=/tmp/allocsvc.key
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;secret/allocatorsecret created
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The allocatorw3secret will let data be served by the webserver over https.&lt;/p&gt;

&lt;p&gt;Create the secret by running this command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl create secret tls allocatorw3secret --cert=/tmp/tls.crt --key=/tmp/tls.key
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The output should be something like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;secret/allocatorw3secret created
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;See that the secrets exist by running:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl get secrets
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The output should contain the secrets:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NAME                     TYPE                                  DATA      AGE
...
allocatorsecret          kubernetes.io/tls                     2         29s
allocatorw3secret        kubernetes.io/tls                     2         15s
...
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;5-create-the-service-account&#34;&gt;5. Create the Service Account&lt;/h3&gt;

&lt;p&gt;This service will interact with Agones via the Agones API by using a &lt;a href=&#34;https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/&#34;&gt;service account&lt;/a&gt; named fleet-allocator.  Specifically, the fleet-allocator service account is granted permissions to perform create operations against GameServerAllocation objects, and get operations against Fleet objects.&lt;/p&gt;

&lt;p&gt;Create the service account by changing directories to your local agones/examples/allocator-service directory and running this command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl create -f service-account.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The output should look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;role.rbac.authorization.k8s.io/fleet-allocator created
serviceaccount/fleet-allocator created
rolebinding.rbac.authorization.k8s.io/fleet-allocator created
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;6-define-and-deploy-the-service&#34;&gt;6. Define and Deploy the Service&lt;/h3&gt;

&lt;p&gt;The service definition defines a &lt;a href=&#34;https://kubernetes.io/docs/concepts/services-networking/service/#nodeport&#34;&gt;nodePort&lt;/a&gt; service which uses https, and sets up ports and names.  The deployment describes the number of replicas we would like, which account to use, which image to use, and defines a health check.&lt;/p&gt;

&lt;p&gt;Define and Deploy the service by running this command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl create -f allocator-service.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The output should look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;service/fleet-allocator-backend created
deployment.apps/fleet-allocator created
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;7-deploy-the-ingress-resource&#34;&gt;7. Deploy the Ingress Resource&lt;/h3&gt;

&lt;p&gt;This &lt;a href=&#34;https://kubernetes.io/docs/concepts/services-networking/ingress/&#34;&gt;Ingress&lt;/a&gt; directs traffic to the allocator service using an ephemeral IP address.  The allocator service pod needs to exist and the readiness probe should be passing health checks before the ingress is created.&lt;/p&gt;

&lt;p&gt;Deploy the Ingress with this command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl apply -f allocator-ingress.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The output should look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ingress.extensions/fleet-allocator-ingress created
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;8-retrieve-the-ephemeral-public-ip-address&#34;&gt;8. Retrieve the Ephemeral Public IP Address&lt;/h3&gt;

&lt;p&gt;After deployment, it will take about a minute for the IP address to be present, and up to 10 minutes before it can start returning data.&lt;/p&gt;

&lt;p&gt;Run this command to get the IP address:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl get ingress fleet-allocator-ingress
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The output should look something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NAME                      HOSTS     ADDRESS          PORTS     AGE
fleet-allocator-ingress   *         35.186.225.103   80, 443   1m
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To learn more about the status of the ingress, run:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl get ingress fleet-allocator-ingress -o yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When the output shows the ingress.kubernetes.io/backends as &amp;lsquo;HEALTHY&amp;rsquo; rather than &amp;lsquo;UNHEALTHY&amp;rsquo; or &amp;lsquo;UNKOWN&amp;rsquo; it is probably ready.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    ingress.kubernetes.io/backends: &#39;{&amp;quot;k8s-be-30021--7e98a70481f48a13&amp;quot;:&amp;quot;HEALTHY&amp;quot;}&#39;
    ingress.kubernetes.io/https-forwarding-rule: k8s-fws-default-fleet-allocator-ingress--7e98a70481f48a13
    ingress.kubernetes.io/https-target-proxy: k8s-tps-default-fleet-allocator-ingress--7e98a70481f48a13
    ingress.kubernetes.io/ssl-cert: k8s-ssl-1ab99915a1f6b5f1-b2a9924cee73d20a--7e98a70481f48a13
    ingress.kubernetes.io/url-map: k8s-um-default-fleet-allocator-ingress--7e98a70481f48a13
    kubectl.kubernetes.io/last-applied-configuration: |
      {&amp;quot;apiVersion&amp;quot;:&amp;quot;extensions/v1beta1&amp;quot;,&amp;quot;kind&amp;quot;:&amp;quot;Ingress&amp;quot;,&amp;quot;metadata&amp;quot;:{&amp;quot;annotations&amp;quot;:{&amp;quot;kubernetes.io/ingress.allow-http&amp;quot;:&amp;quot;false&amp;quot;,&amp;quot;kubernetes.io/ingress.class&amp;quot;:&amp;quot;gce&amp;quot;},&amp;quot;labels&amp;quot;:{&amp;quot;app&amp;quot;:&amp;quot;fleet-allocator&amp;quot;},&amp;quot;name&amp;quot;:&amp;quot;fleet-allocator-ingress&amp;quot;,&amp;quot;namespace&amp;quot;:&amp;quot;default&amp;quot;},&amp;quot;spec&amp;quot;:{&amp;quot;backend&amp;quot;:{&amp;quot;serviceName&amp;quot;:&amp;quot;fleet-allocator-backend&amp;quot;,&amp;quot;servicePort&amp;quot;:8000},&amp;quot;tls&amp;quot;:[{&amp;quot;secretName&amp;quot;:&amp;quot;allocatorsecret&amp;quot;}]}}
    kubernetes.io/ingress.allow-http: &amp;quot;false&amp;quot;
    kubernetes.io/ingress.class: gce
  creationTimestamp: 2018-09-23T19:13:36Z
  generation: 1
  labels:
    app: fleet-allocator
  name: fleet-allocator-ingress
  namespace: default
  resourceVersion: &amp;quot;4086&amp;quot;
  selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/fleet-allocator-ingress
  uid: c5a149b3-bf64-11e8-8a6e-42010a8e013f
spec:
  backend:
    serviceName: fleet-allocator-backend
    servicePort: 8000
  tls:
  - secretName: allocatorsecret
status:
  loadBalancer:
    ingress:
    - ip: 35.186.225.103
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;9-check-game-servers&#34;&gt;9. Check Game Servers&lt;/h3&gt;

&lt;p&gt;Let&amp;rsquo;s make sure that we have one or more Game Servers in a ready state by running this command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl get gs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For a fleet of 2 replicas, you should see 2 Game Servers with a Status of Ready:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NAME                     STATE     ADDRESS           PORT    NODE       AGE                                
simple-udp-s2snf-765bc   Ready     35.231.204.26     7260    minikube   5m
simple-udp-s2snf-vf6l8   Ready     35.196.162.169    7591    minikube   5m
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If there is no fleet, please review &lt;a href=&#34;/site/site/docs/getting-started/create-fleet/&#34;&gt;Create a Game Server Fleet&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&#34;10-allocate-a-game-server&#34;&gt;10. Allocate a Game Server&lt;/h3&gt;

&lt;p&gt;Now that the ingress has been created, let&amp;rsquo;s allocate a Game Server by passing in our user and key to the /address endpoint.  This will call the allocate() function in main.go, which will return a JSON string of the GameServerStatus of an allocated GameServer, or an error.  The service uses Basic Auth to provide some security as to who can allocate GameServer resources, and the generated key is in main.go, in the function basicAuth().  Read the comments and code in main.go for a more detailed explanation of each function and method.&lt;/p&gt;

&lt;p&gt;Allocate a Game Server by running this command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl -k -u v1GameClientKey:EAEC945C371B2EC361DE399C2F11E https://[the.ip.address]/address
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The output should show the JSON of the GameServerStatus, similar to this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{&amp;quot;status&amp;quot;:&amp;quot;Allocated&amp;quot;}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You may need to wait a few moments longer if the output has ssl errors like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl: (35) error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Check the Game Servers again, and notice the Allocated Status.  You should see something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NAME                     STATUS      ADDRESS          PORT    NODE      AGE
simple-udp-s2snf-765bc   Allocated   35.231.204.26    7260    minikube   5m
simple-udp-s2snf-vf6l8   Ready       35.196.162.169   7591    minikube   5m
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Congratulations, your call to the API has allocated a Game Server from your simple-udp Fleet!&lt;/p&gt;

&lt;h3 id=&#34;11-cleanup&#34;&gt;11. Cleanup&lt;/h3&gt;

&lt;p&gt;You can delete the allocator service and associated resources with the following commands.&lt;/p&gt;

&lt;p&gt;Delete the Ingress&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl delete ingress fleet-allocator-ingress
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Delete the Service&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl delete -f allocator-service.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Delete the Service Account&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kubectl delete -f service-account.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Delete the health check and firewall rules&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gcloud compute health-checks delete fleet-allocator-healthcheck
gcloud compute firewall-rules delete fleet-allocator-healthcheck
gcloud compute health-checks delete nodeport-rule
gcloud compute firewall-rules delete nodeport-rule
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Customize the service by changing the constants and service key in main.go&lt;/li&gt;
&lt;li&gt;Make the &lt;a href=&#34;https://cloud.google.com/kubernetes-engine/docs/tutorials/configuring-domain-name-static-ip&#34;&gt;IP Address Permanent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Create an A record that points to your permanent IP address&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/site/site/docs/getting-started/create-fleetautoscaler/&#34;&gt;Create a Fleet Autoscaler&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
  </channel>
</rss>
